001: /*BEGIN_COPYRIGHT_BLOCK
002: *
003: * Copyright (c) 2001-2007, JavaPLT group at Rice University (javaplt@rice.edu)
004: * All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions are met:
008: * * Redistributions of source code must retain the above copyright
009: * notice, this list of conditions and the following disclaimer.
010: * * Redistributions in binary form must reproduce the above copyright
011: * notice, this list of conditions and the following disclaimer in the
012: * documentation and/or other materials provided with the distribution.
013: * * Neither the names of DrJava, the JavaPLT group, Rice University, nor the
014: * names of its contributors may be used to endorse or promote products
015: * derived from this software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
018: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
019: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
020: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
021: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
022: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
023: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
024: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
025: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
026: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: *
029: * This software is Open Source Initiative approved Open Source Software.
030: * Open Source Initative Approved is a trademark of the Open Source Initiative.
031: *
032: * This file is part of DrJava. Download the current version of this project
033: * from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/
034: *
035: * END_COPYRIGHT_BLOCK*/
036:
037: package edu.rice.cs.drjava.ui;
038:
039: import javax.swing.*;
040: import javax.swing.event.*;
041: import javax.swing.text.*;
042: import javax.swing.border.*;
043: import java.awt.event.*;
044: import java.awt.*;
045:
046: import edu.rice.cs.drjava.DrJava;
047: import edu.rice.cs.drjava.config.OptionConstants;
048: import edu.rice.cs.util.UnexpectedException;
049: import edu.rice.cs.util.StringOps;
050: import edu.rice.cs.util.swing.BorderlessScrollPane;
051:
052: /** Displays a popup window for the first uncaught exception or logged conditions.
053: * @version $Id$
054: */
055: public class DrJavaErrorPopup extends JDialog {
056: /** information about the error */
057: private JComponent _errorInfo;
058: /** contains the stack trace */
059: private JCheckBox _keepDisplaying;
060: /** compresses the buttonPanel into the east */
061: private JPanel _bottomPanel;
062: /** contains the butons */
063: private JPanel _buttonPanel;
064: /** the button that closes this window */
065: private JButton _okButton;
066: /** the button that shows the error window */
067: private JButton _moreButton;
068: /** the error */
069: private Throwable _error;
070: /** the parent frame */
071: private static JFrame _parentFrame = new JFrame();
072:
073: /** Creates a window to graphically display the current error that has occurred in the code of DrJava. */
074: public DrJavaErrorPopup(JFrame parent, Throwable error) {
075: super (parent, "DrJava Error");
076:
077: _parentFrame = parent;
078: _error = error;
079:
080: this .setSize(500, 150);
081:
082: // If we set this pane to be of type text/rtf, it wraps based on words
083: // as opposed to based on characters.
084: _keepDisplaying = new JCheckBox(
085: "Keep showing this notification",
086: DrJava
087: .getConfig()
088: .getSetting(
089: OptionConstants.DIALOG_DRJAVA_ERROR_POPUP_ENABLED)
090: .booleanValue());
091: _keepDisplaying.addChangeListener(new ChangeListener() {
092: public void stateChanged(ChangeEvent e) {
093: DrJava
094: .getConfig()
095: .setSetting(
096: OptionConstants.DIALOG_DRJAVA_ERROR_POPUP_ENABLED,
097: _keepDisplaying.isSelected());
098: }
099: });
100:
101: _moreButton = new JButton(_moreAction);
102: _okButton = new JButton(_okAction);
103:
104: _bottomPanel = new JPanel(new BorderLayout());
105: _buttonPanel = new JPanel();
106: _buttonPanel.add(_moreButton);
107: _buttonPanel.add(_okButton);
108: _bottomPanel.add(_keepDisplaying, BorderLayout.WEST);
109: _bottomPanel.add(_buttonPanel, BorderLayout.EAST);
110:
111: if (_error instanceof DrJavaErrorHandler.LoggedCondition) {
112: msg[1] = "Logged condition: " + _error.getMessage();
113: } else {
114: msg[1] = _error.toString();
115: }
116: _errorInfo = new JOptionPane(msg, JOptionPane.ERROR_MESSAGE,
117: JOptionPane.DEFAULT_OPTION, null, new Object[0]);
118:
119: JPanel cp = new JPanel(new BorderLayout(5, 5));
120: cp.setBorder(new EmptyBorder(5, 5, 5, 5));
121: setContentPane(cp);
122: cp.add(_errorInfo, BorderLayout.CENTER);
123: cp.add(_bottomPanel, BorderLayout.SOUTH);
124: getRootPane().setDefaultButton(_okButton);
125: }
126:
127: /* Close the window. */
128: private Action _okAction = new AbstractAction("OK") {
129: public void actionPerformed(ActionEvent e) {
130: DrJavaErrorPopup.this .dispose();
131: }
132: };
133:
134: /** Close this window, but display the full DrJava Errors window. */
135: private Action _moreAction = new AbstractAction("More Information") {
136: public void actionPerformed(ActionEvent e) {
137: _okAction.actionPerformed(e);
138: MainFrame.setPopupLoc(DrJavaErrorWindow.singleton(),
139: DrJavaErrorWindow.singleton().getFrame());
140: DrJavaErrorWindow.singleton().setVisible(true);
141: }
142: };
143:
144: /**
145: * Contains the canned message for the user
146: */
147: private final String[] msg = { "An error occurred in DrJava:", "",
148: "You may wish to save all your work and restart DrJava." };
149: }
|