KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > java > plugin > boot > ErrorDialog


1 /*****************************************************************************
2  * Java Plug-in Framework (JPF)
3  * Copyright (C) 2004-2006 Dmitry Olshansky
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *****************************************************************************/

19 package org.java.plugin.boot;
20
21 import java.awt.BorderLayout JavaDoc;
22 import java.awt.Component JavaDoc;
23 import java.awt.FlowLayout JavaDoc;
24 import java.awt.Frame JavaDoc;
25 import java.awt.event.ActionEvent JavaDoc;
26 import java.awt.event.KeyEvent JavaDoc;
27 import java.awt.event.MouseAdapter JavaDoc;
28 import java.awt.event.MouseEvent JavaDoc;
29 import java.lang.reflect.InvocationTargetException JavaDoc;
30 import java.sql.SQLException JavaDoc;
31 import java.util.Collection JavaDoc;
32 import java.util.Date JavaDoc;
33 import java.util.Iterator JavaDoc;
34 import java.util.Map JavaDoc;
35 import java.util.TreeMap JavaDoc;
36
37 import javax.swing.AbstractAction JavaDoc;
38 import javax.swing.BoxLayout JavaDoc;
39 import javax.swing.DefaultListModel JavaDoc;
40 import javax.swing.JButton JavaDoc;
41 import javax.swing.JComponent JavaDoc;
42 import javax.swing.JDialog JavaDoc;
43 import javax.swing.JLabel JavaDoc;
44 import javax.swing.JList JavaDoc;
45 import javax.swing.JOptionPane JavaDoc;
46 import javax.swing.JPanel JavaDoc;
47 import javax.swing.JRootPane JavaDoc;
48 import javax.swing.JScrollPane JavaDoc;
49 import javax.swing.JTabbedPane JavaDoc;
50 import javax.swing.JTextArea JavaDoc;
51 import javax.swing.KeyStroke JavaDoc;
52
53 import org.java.plugin.util.ResourceManager;
54
55 /**
56  * Helper class to display detailed message about application error.
57  *
58  * @version $Id: ErrorDialog.java,v 1.4 2006/09/05 17:48:51 ddimon Exp $
59  */

60 public class ErrorDialog extends JDialog JavaDoc {
61     private static final long serialVersionUID = 7142861251076530780L;
62
63     /**
64      * Displays error dialogue to the user.
65      * @param parentComponent parent component, may be <code>null</code>
66      * @param title window title
67      * @param message error message
68      */

69     public static void showError(final Component JavaDoc parentComponent,
70             final String JavaDoc title, final String JavaDoc message) {
71         showError(parentComponent, title, message, null, null);
72     }
73
74     /**
75      * Displays error dialogue to the user.
76      * @param parentComponent parent component, may be <code>null</code>
77      * @param title window title
78      * @param message error message
79      * @param data error data, {@link Collection collections} and arrays are
80      * handled specially, all other objects are shown using
81      * <code>toString()</code> method
82      */

83     public static void showError(final Component JavaDoc parentComponent,
84             final String JavaDoc title, final String JavaDoc message, final Object JavaDoc data) {
85         showError(parentComponent, title, message, data, null);
86     }
87
88     /**
89      * Displays error dialogue to the user.
90      * @param parentComponent parent component, may be <code>null</code>
91      * @param title window title
92      * @param data error data, {@link Collection collections} and arrays are
93      * handled specially, all other objects are shown using
94      * <code>toString()</code> method
95      * @param error an error to be shown in details section
96      */

97     public static void showError(final Component JavaDoc parentComponent,
98             final String JavaDoc title, final Object JavaDoc data, final Throwable JavaDoc error) {
99         String JavaDoc message = error.getMessage();
100         if ((message == null) || (message.trim().length() == 0)) {
101             message = error.toString();
102         }
103         showError(parentComponent, title, message, data, error);
104     }
105
106     /**
107      * Displays error dialogue to the user.
108      * @param parentComponent parent component, may be <code>null</code>
109      * @param title window title
110      * @param error an error to be shown in details section
111      */

112     public static void showError(final Component JavaDoc parentComponent,
113             final String JavaDoc title, final Throwable JavaDoc error) {
114         String JavaDoc message = error.getMessage();
115         if ((message == null) || (message.trim().length() == 0)) {
116             message = error.toString();
117         }
118         showError(parentComponent, title, message, error);
119     }
120
121     /**
122      * Displays error dialogue to the user.
123      * @param parentComponent parent component, may be <code>null</code>
124      * @param title window title
125      * @param message error message
126      * @param error an error to be shown in details section
127      */

128     public static void showError(final Component JavaDoc parentComponent,
129             final String JavaDoc title, final String JavaDoc message, final Throwable JavaDoc error) {
130         showError(parentComponent, title, message, null, error);
131     }
132
133     /**
134      * Displays error dialogue to the user.
135      * @param parentComponent parent component, may be <code>null</code>
136      * @param title window title
137      * @param message error message
138      * @param data error data, {@link Collection collections} and arrays are
139      * handled specially, all other objects are shown using
140      * <code>toString()</code> method
141      * @param error an error to be shown in details section
142      */

143     public static void showError(final Component JavaDoc parentComponent,
144             final String JavaDoc title, final String JavaDoc message, final Object JavaDoc data,
145             final Throwable JavaDoc error) {
146         Frame JavaDoc frame = (parentComponent != null) ? JOptionPane
147                 .getFrameForComponent(parentComponent) : JOptionPane
148                 .getRootFrame();
149         new ErrorDialog(frame, title, message, data, error, false).show();
150     }
151
152     /**
153      * Displays error dialogue to the user and lets him to make a decision with
154      * "Yes" and "No" buttons. The question should be in the given message.
155      * @param parentComponent parent component, may be <code>null</code>
156      * @param title window title
157      * @param message error message
158      * @return <code>true</code> if user chooses "Yes" answer
159      */

160     public static boolean showWarning(final Component JavaDoc parentComponent,
161             final String JavaDoc title, final String JavaDoc message) {
162         return showWarning(parentComponent, title, message, null, null);
163     }
164
165     /**
166      * Displays error dialogue to the user and lets him to make a decision with
167      * "Yes" and "No" buttons. The question should be in the given message.
168      * @param parentComponent parent component, may be <code>null</code>
169      * @param title window title
170      * @param message error message
171      * @param data error data, {@link Collection collections} and arrays are
172      * handled specially, all other objects are shown using
173      * <code>toString()</code> method
174      * @return <code>true</code> if user chooses "Yes" answer
175      */

176     public static boolean showWarning(final Component JavaDoc parentComponent,
177             final String JavaDoc title, final String JavaDoc message, final Object JavaDoc data) {
178         return showWarning(parentComponent, title, message, data, null);
179     }
180
181     /**
182      * Displays error dialogue to the user and lets him to make a decision with
183      * "Yes" and "No" buttons. The question should be in the given message.
184      * @param parentComponent parent component, may be <code>null</code>
185      * @param title window title
186      * @param message error message
187      * @param error an error to be shown in details section
188      * @return <code>true</code> if user chooses "Yes" answer
189      */

190     public static boolean showWarning(final Component JavaDoc parentComponent,
191             final String JavaDoc title, final String JavaDoc message, final Throwable JavaDoc error) {
192         return showWarning(parentComponent, title, message, null, error);
193     }
194
195     /**
196      * Displays error dialogue to the user and lets him to make a decision with
197      * "Yes" and "No" buttons. The question should be in the given message.
198      * @param parentComponent parent component, may be <code>null</code>
199      * @param title window title
200      * @param message error message
201      * @param data error data, {@link Collection collections} and arrays are
202      * handled specially, all other objects are shown using
203      * <code>toString()</code> method
204      * @param error an error to be shown in details section
205      * @return <code>true</code> if user chooses "Yes" answer
206      */

207     public static boolean showWarning(final Component JavaDoc parentComponent,
208             final String JavaDoc title, final String JavaDoc message, final Object JavaDoc data,
209             final Throwable JavaDoc error) {
210         Frame JavaDoc frame = (parentComponent != null) ? JOptionPane
211                 .getFrameForComponent(parentComponent) : JOptionPane
212                 .getRootFrame();
213         ErrorDialog dialog = new ErrorDialog(frame, title, message, data, error,
214                 true);
215         dialog.show();
216         return dialog.yesBtnPressed;
217     }
218     
219     /**
220      * Utility method to get detailed error report.
221      * @param t exception instance, may be <code>null</code>
222      * @return detailed error message with most important system information
223      * included
224      */

225     public static String JavaDoc getErrorDetails(final Throwable JavaDoc t) {
226         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
227         String JavaDoc nl = System.getProperty("line.separator"); //$NON-NLS-1$
228
sb.append(new Date JavaDoc()).append(nl);
229         if (t != null) {
230             // Print exception details.
231
sb.append(nl).append(
232                     "-----------------------------------------------") //$NON-NLS-1$
233
.append(nl);
234             sb.append("Exception details.").append(nl).append(nl); //$NON-NLS-1$
235
sb.append("Class: ").append(t.getClass().getName()).append(nl); //$NON-NLS-1$
236
sb.append("Message: ").append(t.getMessage()).append(nl); //$NON-NLS-1$
237
printError(t, "Stack trace:", sb); //$NON-NLS-1$
238
}
239         // Print system properties.
240
sb.append(nl).append("-----------------------------------------------") //$NON-NLS-1$
241
.append(nl);
242         sb.append("System properties:").append(nl).append(nl); //$NON-NLS-1$
243
for (Iterator JavaDoc it = new TreeMap JavaDoc(System.getProperties()).entrySet()
244                 .iterator(); it.hasNext();) {
245             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
246             sb.append(entry.getKey()).append("=") //$NON-NLS-1$
247
.append(entry.getValue()).append(nl);
248         }
249         // Print runtime info.
250
sb.append(nl).append("-----------------------------------------------") //$NON-NLS-1$
251
.append(nl);
252         sb.append("Runtime info:").append(nl).append(nl); //$NON-NLS-1$
253
Runtime JavaDoc rt = Runtime.getRuntime();
254         sb.append("Memory TOTAL / FREE / MAX: ") //$NON-NLS-1$
255
.append(rt.totalMemory()).append(" / ") //$NON-NLS-1$
256
.append(rt.freeMemory()).append(" / ") //$NON-NLS-1$
257
.append(rt.maxMemory()).append(nl);
258         sb.append("Available processors: ") //$NON-NLS-1$
259
.append(rt.availableProcessors()).append(nl);
260         sb.append("System class loader: ").append("" //$NON-NLS-1$ //$NON-NLS-2$
261
+ ClassLoader.getSystemClassLoader()).append(nl);
262         sb.append("Thread context class loader: ").append("" //$NON-NLS-1$ //$NON-NLS-2$
263
+ Thread.currentThread().getContextClassLoader()).append(nl);
264         sb.append("Security manager: ").append("" //$NON-NLS-1$ //$NON-NLS-2$
265
+ System.getSecurityManager()).append(nl);
266         return sb.toString();
267     }
268
269     /**
270      * Prints detailed stack trace to the given buffer.
271      * @param t exception instance, may be <code>null</code>
272      * @param header stack trace caption
273      * @param sb output text buffer
274      */

275     public static void printError(final Throwable JavaDoc t, final String JavaDoc header,
276             final StringBuffer JavaDoc sb) {
277         if (t == null) {
278             return;
279         }
280         String JavaDoc nl = System.getProperty("line.separator"); //$NON-NLS-1$
281
sb.append(nl).append(header).append(nl).append(nl);
282         StackTraceElement JavaDoc[] stackTrace = t.getStackTrace();
283         for (int i = 0; i < stackTrace.length; i++) {
284             sb.append(stackTrace[i].toString()).append(nl);
285         }
286         Throwable JavaDoc next = t.getCause();
287         printError(next, "Caused by " + next, sb); //$NON-NLS-1$
288
if (t instanceof SQLException JavaDoc) {
289             // Handle SQLException specifically.
290
next = ((SQLException JavaDoc) t).getNextException();
291             printError(next, "Next exception: " + next, sb); //$NON-NLS-1$
292
} else if (t instanceof InvocationTargetException JavaDoc) {
293             // Handle InvocationTargetException specifically.
294
next = ((InvocationTargetException JavaDoc) t).getTargetException();
295             printError(next, "Target exception: " + next, sb); //$NON-NLS-1$
296
}
297     }
298
299     private javax.swing.JPanel JavaDoc jContentPane = null;
300     private JPanel JavaDoc jPanel = null;
301     private JLabel JavaDoc messageLabel = null;
302     private JLabel JavaDoc errorLabel = null;
303     private JPanel JavaDoc jPanel1 = null;
304     private JButton JavaDoc closeButton = null;
305     private JScrollPane JavaDoc jScrollPane = null;
306     JTextArea JavaDoc jTextArea = null;
307     private JTabbedPane JavaDoc jTabbedPane = null;
308     private JPanel JavaDoc jPanelInfo = null;
309     private JScrollPane JavaDoc jScrollPane2 = null;
310     private JList JavaDoc jList = null;
311     private JLabel JavaDoc dataLabel = null;
312     boolean yesBtnPressed = false;
313     private JButton JavaDoc yesButton = null;
314
315     private ErrorDialog(final Frame JavaDoc owner, final String JavaDoc title, final String JavaDoc message,
316             final Object JavaDoc data, final Throwable JavaDoc t, boolean yesNo) {
317         super((owner != null) ? owner : JOptionPane.getRootFrame());
318         initialize();
319         setLocationRelativeTo(getOwner());
320         jTabbedPane.setTitleAt(0, ResourceManager.getMessage(Boot.PACKAGE_NAME,
321                 "infoTabLabel")); //$NON-NLS-1$
322
jTabbedPane.setTitleAt(1, ResourceManager.getMessage(Boot.PACKAGE_NAME,
323                 "detailsTabLabel")); //$NON-NLS-1$
324
setTitle(title);
325         messageLabel.setText(message);
326         if (t != null) {
327             errorLabel.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME,
328                     "errorLabel", t)); //$NON-NLS-1$
329
} else {
330             getJPanel().remove(errorLabel);
331         }
332         if (data instanceof Collection JavaDoc) {
333             DefaultListModel JavaDoc model = new DefaultListModel JavaDoc();
334             for (Iterator JavaDoc it = ((Collection JavaDoc) data).iterator(); it.hasNext();) {
335                 model.addElement(it.next());
336             }
337             jList.setModel(model);
338             getJPanel().remove(dataLabel);
339         } else if (data instanceof Object JavaDoc[]) {
340             DefaultListModel JavaDoc model = new DefaultListModel JavaDoc();
341             for (int i = 0; i < ((Object JavaDoc[]) data).length; i++) {
342                 model.addElement(((Object JavaDoc[]) data)[i]);
343             }
344             jList.setModel(model);
345             getJPanel().remove(dataLabel);
346         } else if (data != null) {
347             dataLabel.setText(data.toString());
348             getJPanelInfo().remove(getJScrollPane());
349         } else {
350             getJPanel().remove(dataLabel);
351             getJPanelInfo().remove(getJScrollPane());
352         }
353         jTextArea.setText(getErrorDetails(t));
354         jTextArea.setCaretPosition(0);
355         if (yesNo) {
356             closeButton.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME,
357                     "noLabel")); //$NON-NLS-1$
358
yesButton.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME,
359                     "yesLabel")); //$NON-NLS-1$
360
} else {
361             getJPanel1().remove(yesButton);
362             closeButton.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME,
363                     "closeLabel")); //$NON-NLS-1$
364
}
365     }
366
367     private void initialize() {
368         this.setDefaultCloseOperation(
369                 javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
370         this.setModal(true);
371         this.setTitle("An error has occurred"); //$NON-NLS-1$
372
this.setSize(460, 280);
373         this.setContentPane(getJContentPane());
374         getRootPane().setWindowDecorationStyle(JRootPane.ERROR_DIALOG);
375         getRootPane().setDefaultButton(closeButton);
376         getRootPane().getInputMap(
377                 JComponent.WHEN_IN_FOCUSED_WINDOW).put(
378                 KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
379                 "doCloseDefault"); //$NON-NLS-1$
380
getRootPane().getActionMap().put("doCloseDefault", //$NON-NLS-1$
381
new AbstractAction JavaDoc() {
382             private static final long serialVersionUID = -9167454634726502084L;
383
384             public void actionPerformed(final ActionEvent JavaDoc evt) {
385                 dispose();
386             }
387         });
388         getRootPane().setDefaultButton(getCloseButton());
389     }
390
391     private javax.swing.JPanel JavaDoc getJContentPane() {
392         if (jContentPane == null) {
393             BorderLayout JavaDoc borderLayout2 = new BorderLayout JavaDoc();
394             jContentPane = new javax.swing.JPanel JavaDoc();
395             jContentPane.setLayout(borderLayout2);
396             borderLayout2.setVgap(2);
397             jContentPane.add(getJPanel1(), java.awt.BorderLayout.SOUTH);
398             jContentPane.add(getJTabbedPane(), java.awt.BorderLayout.CENTER);
399         }
400         return jContentPane;
401     }
402
403     private JPanel JavaDoc getJPanel() {
404         if (jPanel == null) {
405             dataLabel = new JLabel JavaDoc();
406             dataLabel.setText("JLabel"); //$NON-NLS-1$
407
errorLabel = new JLabel JavaDoc();
408             messageLabel = new JLabel JavaDoc();
409             jPanel = new JPanel JavaDoc();
410             jPanel.setLayout(new BoxLayout JavaDoc(getJPanel(), BoxLayout.Y_AXIS));
411             messageLabel.setText("JLabel"); //$NON-NLS-1$
412
errorLabel.setText("JLabel"); //$NON-NLS-1$
413
jPanel.add(messageLabel, null);
414             jPanel.add(errorLabel, null);
415             jPanel.add(dataLabel, null);
416         }
417         return jPanel;
418     }
419
420     private JPanel JavaDoc getJPanel1() {
421         if (jPanel1 == null) {
422             FlowLayout JavaDoc flowLayout = new FlowLayout JavaDoc();
423             flowLayout.setAlignment(java.awt.FlowLayout.RIGHT);
424             jPanel1 = new JPanel JavaDoc();
425             jPanel1.setLayout(flowLayout);
426             jPanel1.add(getYesButton(), null);
427             jPanel1.add(getCloseButton(), null);
428         }
429         return jPanel1;
430     }
431
432     private JButton JavaDoc getCloseButton() {
433         if (closeButton == null) {
434             closeButton = new JButton JavaDoc();
435             closeButton.setText("Close"); //$NON-NLS-1$
436
closeButton.setSelected(true);
437             closeButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
438                 public void actionPerformed(java.awt.event.ActionEvent JavaDoc e) {
439                     dispose();
440                 }
441             });
442         }
443         return closeButton;
444     }
445
446     private JScrollPane JavaDoc getJScrollPane() {
447         if (jScrollPane == null) {
448             jScrollPane = new JScrollPane JavaDoc();
449             jScrollPane.setViewportView(getJList());
450         }
451         return jScrollPane;
452     }
453
454     private JTextArea JavaDoc getJTextArea() {
455         if (jTextArea == null) {
456             jTextArea = new JTextArea JavaDoc();
457             jTextArea.setBackground(java.awt.SystemColor.control);
458             jTextArea.setEditable(false);
459             jTextArea.setOpaque(false);
460             jTextArea.addMouseListener(new MouseAdapter JavaDoc() {
461                 public void mousePressed(final MouseEvent JavaDoc evt) {
462                     if (!evt.isPopupTrigger()) {
463                         return;
464                     }
465                     copyText();
466                 }
467                 
468                 public void mouseReleased(final MouseEvent JavaDoc evt) {
469                     if (!evt.isPopupTrigger()) {
470                         return;
471                     }
472                     copyText();
473                 }
474                 
475                 private void copyText() {
476                     if (jTextArea.getSelectedText() != null) {
477                         jTextArea.copy();
478                         return;
479                     }
480                     jTextArea.setSelectionStart(0);
481                     jTextArea.setSelectionEnd(jTextArea.getText().length());
482                     jTextArea.copy();
483                     jTextArea.setSelectionEnd(0);
484                 }
485             });
486         }
487         return jTextArea;
488     }
489
490     private JTabbedPane JavaDoc getJTabbedPane() {
491         if (jTabbedPane == null) {
492             jTabbedPane = new JTabbedPane JavaDoc();
493             jTabbedPane.addTab("Info", null, getJPanelInfo(), null); //$NON-NLS-1$
494
jTabbedPane.addTab("Details", null, getJScrollPane2(), null); //$NON-NLS-1$
495
}
496         return jTabbedPane;
497     }
498
499     private JPanel JavaDoc getJPanelInfo() {
500         if (jPanelInfo == null) {
501             jPanelInfo = new JPanel JavaDoc();
502             jPanelInfo.setLayout(new BorderLayout JavaDoc());
503             jPanelInfo.add(getJPanel(), java.awt.BorderLayout.NORTH);
504             jPanelInfo.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
505         }
506         return jPanelInfo;
507     }
508
509     private JScrollPane JavaDoc getJScrollPane2() {
510         if (jScrollPane2 == null) {
511             jScrollPane2 = new JScrollPane JavaDoc();
512             jScrollPane2.setViewportView(getJTextArea());
513         }
514         return jScrollPane2;
515     }
516
517     private JList JavaDoc getJList() {
518         if (jList == null) {
519             jList = new JList JavaDoc();
520         }
521         return jList;
522     }
523
524     private JButton JavaDoc getYesButton() {
525         if (yesButton == null) {
526             yesButton = new JButton JavaDoc();
527             yesButton.setText("Yes"); //$NON-NLS-1$
528
yesButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
529                 public void actionPerformed(java.awt.event.ActionEvent JavaDoc e) {
530                     yesBtnPressed = true;
531                     dispose();
532                 }
533             });
534         }
535         return yesButton;
536     }
537 } // @jve:decl-index=0:visual-constraint="10,10"
538
Popular Tags