package com.illumina.basespace.igv.ui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.LayoutStyle.ComponentPlacement;
public class DetailDialog extends javax.swing.JDialog implements ClipboardOwner
{
private static Image errorSmall = ImageProvider.instance().getImage("error16x16.png");
private static Icon errorLarge = ImageProvider.instance().getIcon("error64x64.png");
private static Image infoSmall = ImageProvider.instance().getImage("info16x16.png");
private static Icon infoLarge = ImageProvider.instance().getIcon("info64x64.png");
private static Image warningSmall = ImageProvider.instance().getImage("warning.gif");
private static Icon warningLarge = ImageProvider.instance().getIcon("warning64x64.png");
private NotifyType notifyType = NotifyType.Information;
public DetailDialog(java.awt.Frame parent, boolean modal, String summary, Throwable t)
{
super(parent, modal);
this.notifyType = NotifyType.Error;
initDialog(summary, null, t);
}
public DetailDialog()
{
this.notifyType = NotifyType.Error;
initDialog("This is a summary message", null, null);
}
public DetailDialog(java.awt.Frame parent, boolean modal, Throwable t)
{
this(parent, modal, null, t);
}
public DetailDialog(java.awt.Frame parent, boolean modal, String summary, String detail, NotifyType type)
{
super(parent, modal);
this.notifyType = type;
initDialog(summary, detail, null);
}
public DetailDialog(JDialog parent, boolean modal, String summary, Throwable t)
{
super(parent, modal);
this.notifyType = NotifyType.Error;
initDialog(summary, null, t);
}
public DetailDialog(JDialog parent, boolean modal, Throwable t)
{
this(parent, modal, null, t);
}
public DetailDialog(JDialog parent, boolean modal, String summary, String detail, NotifyType type)
{
super(parent, modal);
this.notifyType = type;
initDialog(summary, detail, null);
}
private void initDialog(String summary, String detail, Throwable e)
{
Throwable t = e;
Action action = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
btnOK.doClick();
}
};
getRootPane().registerKeyboardAction(action, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
initComponents();
Icon largeIcon = infoLarge;
Image smallImage = infoSmall;
String title = "Information";
switch (notifyType)
{
case Warning:
largeIcon = warningLarge;
smallImage = warningSmall;
title = "Warning";
break;
case Error:
largeIcon = errorLarge;
smallImage = errorSmall;
title = "Error";
if (summary == null)
{
summary = t.getMessage() != null && t.getMessage().length() > 0 ? t.getMessage() : "An exception occured (See Detail)";
}
detail = getThrowableDetail(t);
break;
}
setIconImage(smallImage);
setHeaderIcon(largeIcon);
setTitle(title);
setSummaryText(summary);
setDetailText(detail);
btnDetailActionPerformed(null);
EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
summaryPane.scrollRectToVisible(new Rectangle(0, 0));
txtSummary.setCaretPosition(0);
detailPane.scrollRectToVisible(new Rectangle(0, 0));
txtDetail.setCaretPosition(0);
}
});
}
public void setVisible(boolean visible)
{
super.setVisible(visible);
}
public void setSummaryText(String text)
{
txtSummary.setText(text);
}
public String getSummaryText()
{
return txtSummary.getText();
}
public void setDetailText(String text)
{
txtDetail.setText(text);
}
public String getDetailText()
{
return txtDetail.getText();
}
public void setHeaderIcon(Icon icon)
{
lblHeader.setIcon(icon);
}
public Icon getHeaderIcon()
{
return lblHeader.getIcon();
}
public String getThrowableDetail(Throwable t)
{
StringWriter sw = new StringWriter(500);
PrintWriter writer = new PrintWriter(sw);
StringBuilder sb = new StringBuilder(2500);
t.printStackTrace(writer);
sb.append(sw.getBuffer().toString());
writer.close();
return sb.toString();
}
public void lostOwnership(Clipboard clipboard, Transferable contents)
{
}
/** 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.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents()
{
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(new BorderLayout(0, 0));
detailPanel = new JPanel();
detailPanel.setPreferredSize(new Dimension(500, 250));
getContentPane().add(detailPanel, BorderLayout.CENTER);
detailPanel.setLayout(new BorderLayout(0, 0));
detailPane = new javax.swing.JScrollPane();
detailPanel.add(detailPane, BorderLayout.CENTER);
detailPane.setBorder(javax.swing.BorderFactory.createTitledBorder("Additional Detail"));
txtDetail = new javax.swing.JTextPane();
detailPane.setViewportView(txtDetail);
txtDetail.setEditable(false);
txtDetail.setOpaque(false);
infoPanel = new JPanel();
infoPanel.setPreferredSize(new Dimension(500, 150));
getContentPane().add(infoPanel, BorderLayout.NORTH);
infoPanel.setLayout(new BorderLayout(0, 0));
panel = new JPanel();
infoPanel.add(panel, BorderLayout.CENTER);
panel.setPreferredSize(new Dimension(0, 300));
lblHeader = new javax.swing.JLabel();
lblHeader.setVerticalAlignment(javax.swing.SwingConstants.TOP);
summaryPane = new javax.swing.JScrollPane();
txtSummary = new javax.swing.JTextPane();
summaryPane.setBorder(null);
//txtSummary.setContentType("text/html");
txtSummary.setBorder(null);
txtSummary.setEditable(false);
txtSummary.setFocusable(false);
txtSummary.setOpaque(false);
summaryPane.setViewportView(txtSummary);
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(gl_panel.createParallelGroup(Alignment.LEADING).addGroup(
gl_panel.createSequentialGroup().addContainerGap().addComponent(lblHeader).addPreferredGap(ComponentPlacement.RELATED)
.addComponent(summaryPane, GroupLayout.DEFAULT_SIZE, 412, Short.MAX_VALUE).addContainerGap()));
gl_panel.setVerticalGroup(gl_panel.createParallelGroup(Alignment.LEADING).addGroup(
gl_panel.createSequentialGroup().addContainerGap()
.addGroup(gl_panel.createParallelGroup(Alignment.TRAILING).addComponent(summaryPane, Alignment.LEADING).addComponent(lblHeader, Alignment.LEADING))
.addContainerGap(12, Short.MAX_VALUE)));
panel.setLayout(gl_panel);
panel_1 = new JPanel();
FlowLayout flowLayout = (FlowLayout) panel_1.getLayout();
flowLayout.setAlignment(FlowLayout.TRAILING);
infoPanel.add(panel_1, BorderLayout.SOUTH);
btnOK = new javax.swing.JButton();
panel_1.add(btnOK);
btnOK.setText("OK");
btnOK.setPreferredSize(new java.awt.Dimension(100, 23));
btnOK.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnOKActionPerformed(evt);
}
});
btnOK.setIcon(ImageProvider.instance().getIcon("accept.png"));
btnCopy = new javax.swing.JButton();
panel_1.add(btnCopy);
btnCopy.setText("Copy");
btnCopy.setPreferredSize(new java.awt.Dimension(100, 23));
btnCopy.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnCopyActionPerformed(evt);
}
});
btnCopy.setIcon(ImageProvider.instance().getIcon("page_copy.png"));
btnDetail = new javax.swing.JButton();
panel_1.add(btnDetail);
btnDetail.setText("Less >>");
btnDetail.setPreferredSize(new java.awt.Dimension(100, 23));
btnDetail.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnDetailActionPerformed(evt);
}
});
pack();
}// </editor-fold>//GEN-END:initComponents
private void btnDetailActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnDetailActionPerformed
{//GEN-HEADEREND:event_btnDetailActionPerformed
boolean expand = btnDetail.getText().equals("More >>");
detailPanel.setVisible(expand);
btnDetail.setText(expand ? "Less <<" : "More >>");
pack();
}//GEN-LAST:event_btnDetailActionPerformed
private void btnCopyActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnCopyActionPerformed
{//GEN-HEADEREND:event_btnCopyActionPerformed
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection stringSelection = new StringSelection(txtDetail.getText());
clipboard.setContents(stringSelection, this);
}//GEN-LAST:event_btnCopyActionPerformed
private void btnOKActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnOKActionPerformed
{//GEN-HEADEREND:event_btnOKActionPerformed
dispose();
}//GEN-LAST:event_btnOKActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCopy;
private javax.swing.JButton btnDetail;
private javax.swing.JButton btnOK;
private javax.swing.JScrollPane summaryPane;
private javax.swing.JLabel lblHeader;
private javax.swing.JScrollPane detailPane;
private javax.swing.JTextPane txtDetail;
private javax.swing.JTextPane txtSummary;
private JPanel panel;
private JPanel detailPanel;
private JPanel infoPanel;
private JPanel panel_1;
// End of variables declaration//GEN-END:variables
}