/*
* ErrorNotificationDialog.java
*
* Created on 20 Август 2008 г., 15:13
*/
package cli_fmw.utils;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.KeyboardFocusManager;
import java.awt.Window;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JOptionPane;
/**
*
* @author antony
*/
public class ErrorNotificationDialog extends javax.swing.JDialog {
private static final long serialVersionUID = 1;
private String message, details;
private boolean detailVisible = false;
/** Creates new form ErrorNotificationDialog
* @param parent
* @param title
* @param message
* @param details
*/
public ErrorNotificationDialog(Window parent, String title, String message, String details) {
super(parent, ModalityType.APPLICATION_MODAL);
this.message = message;
this.details = details;
initComponents();
setTitle(title);
Color c = tpMessage.getBackground();
tpMessage.setText(message);
taDetails.setText(details);
taDetails.setCaretPosition(0);
//btDetails.setVisible(details != null);
//btDetails.setVisible(false);
//btSentEmail.setVisible(false);
tpMessage.setCaretPosition(0);
btClose.requestFocus();
//StateSaver.attachTo(this);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
spMessageDetail = new javax.swing.JSplitPane();
spDetailsScroll = new javax.swing.JScrollPane();
taDetails = new javax.swing.JTextArea();
pnRoot = new javax.swing.JPanel();
pnMessage = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
btClose = new javax.swing.JButton();
jPanel3 = new javax.swing.JPanel();
btDetails = new javax.swing.JButton();
btSentEmail = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
tpMessage = new javax.swing.JTextPane();
spMessageDetail.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
taDetails.setColumns(20);
taDetails.setEditable(false);
taDetails.setFont(new java.awt.Font("DejaVu Sans", 0, 14));
taDetails.setRows(5);
spDetailsScroll.setViewportView(taDetails);
spMessageDetail.setBottomComponent(spDetailsScroll);
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Ошибка");
setMinimumSize(new java.awt.Dimension(150, 100));
setModal(true);
setName("ErrorNotificationDialog"); // NOI18N
getContentPane().setLayout(new java.awt.GridLayout(1, 0));
pnRoot.setBorder(javax.swing.BorderFactory.createEmptyBorder(12, 12, 12, 12));
pnRoot.setLayout(new java.awt.GridLayout(1, 0));
pnMessage.setLayout(new java.awt.BorderLayout());
jPanel2.setLayout(new java.awt.BorderLayout());
btClose.setText("Закрыть");
btClose.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btCloseActionPerformed(evt);
}
});
jPanel2.add(btClose, java.awt.BorderLayout.EAST);
jPanel3.setLayout(new java.awt.BorderLayout());
btDetails.setText("Показать Технические детали >>>");
btDetails.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btDetailsActionPerformed(evt);
}
});
jPanel3.add(btDetails, java.awt.BorderLayout.WEST);
btSentEmail.setText("Отправить разработчику");
btSentEmail.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btSentEmailActionPerformed(evt);
}
});
jPanel3.add(btSentEmail, java.awt.BorderLayout.CENTER);
jPanel2.add(jPanel3, java.awt.BorderLayout.WEST);
pnMessage.add(jPanel2, java.awt.BorderLayout.SOUTH);
jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
tpMessage.setBackground(getBackground());
tpMessage.setBorder(null);
tpMessage.setEditable(false);
tpMessage.setFont(new java.awt.Font("DejaVu Sans Mono", 0, 13));
jScrollPane1.setViewportView(tpMessage);
pnMessage.add(jScrollPane1, java.awt.BorderLayout.CENTER);
pnRoot.add(pnMessage);
getContentPane().add(pnRoot);
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-825)/2, (screenSize.height-228)/2, 825, 228);
}// </editor-fold>//GEN-END:initComponents
private void btCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btCloseActionPerformed
dispose();
}//GEN-LAST:event_btCloseActionPerformed
private void btSentEmailActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSentEmailActionPerformed
new ErrorMail().sendMail(message + "\n" + details);
dispose();
}//GEN-LAST:event_btSentEmailActionPerformed
private void btDetailsActionPerformed(java.awt.event.ActionEvent evt) {
showDetails(!detailVisible);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btClose;
private javax.swing.JButton btDetails;
private javax.swing.JButton btSentEmail;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPanel pnMessage;
private javax.swing.JPanel pnRoot;
private javax.swing.JScrollPane spDetailsScroll;
private javax.swing.JSplitPane spMessageDetail;
private javax.swing.JTextArea taDetails;
private javax.swing.JTextPane tpMessage;
// End of variables declaration//GEN-END:variables
private static Window validateWindow(Window window){
if (window == null){
return null;
}
if (!window.isDisplayable()){
return null;
}
if (!window.isVisible()){
return null;
}
return window;
}
public static void showDialog(final String title, final String message, final String details) {
if (!EventQueue.isDispatchThread()){
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
showDialog(title, "Ошибка многопоточного выполнения! Приложение будет закрыто! Обратитесь к разработчику." + message, details);
}
});
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
catch (InvocationTargetException ex) {
ex.printStackTrace();
}
System.exit(43);
}
Window win = null;
KeyboardFocusManager mng = KeyboardFocusManager.getCurrentKeyboardFocusManager();
if (win == null) {
win = validateWindow(mng.getActiveWindow());
}
if (win == null) {
win = validateWindow(mng.getFocusedWindow());
}
if (win == null) {
win = validateWindow(JOptionPane.getRootFrame());
}
if (win == null){
Frame[] faremes = Frame.getFrames();
if (faremes != null){
for (Frame frame : faremes) {
win = validateWindow(frame);
if (win != null){
break;
}
}
}
}
ErrorNotificationDialog dlg = new ErrorNotificationDialog(win, title, message, details);
dlg.toFront();
dlg.setVisible(true);
}
private void showDetails(boolean aShow) {
if (detailVisible == aShow){
return;
}
if (aShow){
int detailHeight = spDetailsScroll.getHeight();
if (detailHeight == 0){
detailHeight = spDetailsScroll.getPreferredSize().height;
}
int newHeight = getHeight() + detailHeight + spMessageDetail.getDividerSize();
int messageSize = pnMessage.getHeight();
setSize(getWidth(), newHeight);
pnRoot.remove(pnMessage);
pnRoot.add(spMessageDetail);
spMessageDetail.setDividerLocation(messageSize);
validate();
spMessageDetail.setTopComponent(pnMessage);
spMessageDetail.setDividerLocation(messageSize);
}
else{
int newHeight = getHeight() - spDetailsScroll.getHeight() - spMessageDetail.getDividerSize();
pnRoot.remove(spMessageDetail);
spMessageDetail.remove(pnMessage);
pnRoot.add(pnMessage);
setSize(getWidth(), newHeight);
}
validate();
repaint();
detailVisible = aShow;
/*if (aShow) {
btDetails.setText("Скрыть технические детали <<<");
} else {
btDetails.setText("Показать технические детали >>>");
}
spDetails.setVisible(aShow);
pack();*/
}
}