/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.tools.gui.panels;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.AbstractBorder;
import javax.swing.border.EmptyBorder;
import de.cismet.tools.gui.RoundedPanel;
/**
* DOCUMENT ME!
*
* @author daniel
* @version $Revision$, $Date$
*/
public class AlertPanel extends RoundedPanel {
//~ Static fields/initializers ---------------------------------------------
public static final Color dangerBgColor = new Color(242, 222, 222);
public static final Color dangerBorderColor = new Color(235, 204, 209);
public static final Color dangerMessageColor = new Color(169, 69, 66);
public static final Color infoBgColor = new Color(217, 237, 247);
public static final Color infoBorderColor = new Color(188, 232, 241);
public static final Color infoMessageColor = new Color(80, 112, 152);
public static final Color successBgColor = new Color(223, 240, 216);
public static final Color successBorderColor = new Color(214, 233, 198);
public static final Color successMessageColor = new Color(90, 118, 75);
public static final Color warningBgColor = new Color(252, 248, 227);
public static final Color warningBorderColor = new Color(250, 235, 204);
public static final Color warningMessageColor = new Color(159, 109, 74);
//~ Enums ------------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public static enum TYPE {
//~ Enum constants -----------------------------------------------------
INFO, SUCCESS, WARNING, DANGER
}
//~ Instance fields --------------------------------------------------------
private TYPE type;
private boolean closeable = false;
private AbstractBorder border;
private Component content;
private final ArrayList<ActionListener> closeListeners = new ArrayList<ActionListener>();
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton closeButton;
private javax.swing.JPanel pnlContent;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates a new AlertPanel object.
*/
public AlertPanel() {
this(TYPE.INFO, new JLabel("insert a message"), true);
}
/**
* Creates a new AlertPanel object.
*
* @param t DOCUMENT ME!
* @param message DOCUMENT ME!
* @param closeable DOCUMENT ME!
*/
public AlertPanel(final TYPE t, final String message, final boolean closeable) {
this(t, new JLabel("insert a message"), closeable);
}
/**
* Creates new form AlertPanel.
*
* @param t DOCUMENT ME!
* @param content message DOCUMENT ME!
* @param closeable DOCUMENT ME!
*/
public AlertPanel(final TYPE t, final Component content, final boolean closeable) {
this.alpha = 255;
this.type = t;
this.closeable = closeable;
this.content = content;
initComponents();
this.pnlContent.add(content, BorderLayout.CENTER);
stylePanel();
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param al DOCUMENT ME!
*/
public void addCloseButtonActionListener(final ActionListener al) {
this.closeListeners.add(al);
}
/**
* DOCUMENT ME!
*
* @param al DOCUMENT ME!
*/
public void removeCloseButtonActionListener(final ActionListener al) {
this.closeListeners.remove(al);
}
/**
* DOCUMENT ME!
*
* @param ae DOCUMENT ME!
*/
private void fireCloseEvent(final ActionEvent ae) {
for (final ActionListener al : closeListeners) {
al.actionPerformed(ae);
}
}
/**
* DOCUMENT ME!
*/
private void styleDanger() {
setBackground(dangerBgColor);
border = new RoundedBorder(dangerBorderColor, curve, 1);
if (content instanceof JLabel) {
((JLabel)content).setForeground(dangerMessageColor);
}
}
/**
* DOCUMENT ME!
*/
private void styleSuccess() {
setBackground(successBgColor);
border = new RoundedBorder(successBorderColor, curve, 1);
if (content instanceof JLabel) {
((JLabel)content).setForeground(successMessageColor);
}
}
/**
* DOCUMENT ME!
*/
private void styleWarning() {
setBackground(warningBgColor);
border = new RoundedBorder(warningBorderColor, curve, 1);
if (content instanceof JLabel) {
((JLabel)content).setForeground(warningMessageColor);
}
}
/**
* DOCUMENT ME!
*/
private void styleInfo() {
setBackground(infoBgColor);
border = new RoundedBorder(infoBorderColor, curve, 1);
if (content instanceof JLabel) {
((JLabel)content).setForeground(infoMessageColor);
}
}
/**
* DOCUMENT ME!
*
* @param content DOCUMENT ME!
*/
public void setContent(final Component content) {
this.pnlContent.removeAll();
this.pnlContent.add(content, BorderLayout.CENTER);
}
/**
* DOCUMENT ME!
*
* @param t DOCUMENT ME!
*/
public void setType(final TYPE t) {
this.type = t;
stylePanel();
}
/**
* DOCUMENT ME!
*/
private void stylePanel() {
switch (type) {
case DANGER: {
styleDanger();
break;
}
case SUCCESS: {
styleSuccess();
break;
}
case WARNING: {
styleWarning();
break;
}
default: {
styleInfo();
break;
}
}
this.setBorder(BorderFactory.createCompoundBorder(border, new EmptyBorder(10, 30, 10, 10)));
}
/**
* DOCUMENT ME!
*
* @param args DOCUMENT ME!
*/
public static void main(final String[] args) {
final AlertPanel info = new AlertPanel(
TYPE.INFO,
new JLabel("<html> <b>INFO! </b> What a cool alert message box</html>"),
true);
final AlertPanel success = new AlertPanel(
TYPE.SUCCESS,
new JLabel("<html> <b>SUCCESS! </b>What a cool alert message box</html>"),
true);
final AlertPanel warn = new AlertPanel(
TYPE.WARNING,
new JLabel("<html> <b>WARNING! </b>What a cool alert message box</html>"),
true);
final AlertPanel danger = new AlertPanel(
TYPE.DANGER,
new JLabel("<html> <b>DANGER! </b>What a cool alert message box</html>"),
true);
final JFrame f = new JFrame();
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel p = new JPanel();
p.setBorder(new EmptyBorder(5, 5, 5, 5));
final GridLayout layout = new GridLayout(4, 1);
layout.setHgap(5);
layout.setVgap(5);
p.setLayout(layout);
p.add(info);
p.add(success);
p.add(warn);
p.add(danger);
f.getContentPane().add(p);
f.setVisible(true);
}
/**
* 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() {
java.awt.GridBagConstraints gridBagConstraints;
pnlContent = new javax.swing.JPanel();
if (closeable) {
closeButton = new javax.swing.JButton();
}
setMinimumSize(new java.awt.Dimension(44, 50));
setPreferredSize(new java.awt.Dimension(36, 50));
setLayout(new java.awt.GridBagLayout());
pnlContent.setOpaque(false);
pnlContent.setLayout(new java.awt.BorderLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(pnlContent, gridBagConstraints);
if (closeable) {
closeButton.setIcon(new javax.swing.ImageIcon(
getClass().getResource("/de/cismet/tools/gui/res/glyphicons_207_remove_2.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(
closeButton,
org.openide.util.NbBundle.getMessage(AlertPanel.class, "AlertPanel.closeButton.text")); // NOI18N
closeButton.setBorderPainted(false);
closeButton.setContentAreaFilled(false);
closeButton.setFocusPainted(false);
closeButton.setPreferredSize(new java.awt.Dimension(16, 16));
}
closeButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
closeButtonActionPerformed(evt);
}
});
if (closeable) {
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 10);
add(closeButton, gridBagConstraints);
}
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void closeButtonActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_closeButtonActionPerformed
this.setVisible(false);
fireCloseEvent(evt);
} //GEN-LAST:event_closeButtonActionPerformed
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private static final class RoundedBorder extends AbstractBorder {
//~ Instance fields ----------------------------------------------------
private Color color;
private int arc;
private int thickness;
//~ Constructors -------------------------------------------------------
/**
* Creates a new RoundedBorder object.
*
* @param c DOCUMENT ME!
* @param arc DOCUMENT ME!
* @param thickness DOCUMENT ME!
*/
public RoundedBorder(final Color c, final int arc, final int thickness) {
this.color = c;
this.arc = arc;
this.thickness = thickness;
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
*/
public void setColor(final Color g) {
this.color = g;
}
/**
* DOCUMENT ME!
*
* @param arc DOCUMENT ME!
*/
public void setArc(final int arc) {
this.arc = arc;
}
@Override
public void paintBorder(final Component c,
final Graphics g,
final int x,
final int y,
final int width,
final int height) {
final Graphics2D g2 = (Graphics2D)g;
g2.setColor(this.color);
final int offs = this.thickness;
final int size = offs + offs;
final Shape outer = new RoundRectangle2D.Float(x, y, width, height, arc, arc);
final Shape inner = new RoundRectangle2D.Float(x + offs, y + offs, width - size, height - size, arc, arc);
final Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD);
path.append(outer, false);
path.append(inner, false);
g2.fill(path);
}
@Override
public Insets getBorderInsets(final Component c, final Insets insets) {
insets.set(thickness, thickness, thickness, thickness);
return insets;
}
}
}