package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class SpinningPanel extends JPanel {
private Dimension dimension;
private Component bottomComponent;
private String label;
private SpinWidget spinWidget;
private Color gradientPanelStartColor;
private Color gradientPanelEndColor;
private Color gradientPanelBorderColor;
private Color SpinWidgetColor;
public SpinningPanel(Component bottomComponent, String label,
Dimension dimension) {
this.bottomComponent = bottomComponent;
this.label = label;
this.dimension = dimension;
gradientPanelStartColor = new Color(182, 192, 207);
gradientPanelEndColor = new Color(202, 209, 220);
gradientPanelBorderColor = new Color(154, 164, 183);
SpinWidgetColor = new Color(100, 104, 111);
doMyLayout();
}
protected void doMyLayout() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
GradientPanel labelPanel = new GradientPanel(gradientPanelStartColor,
gradientPanelEndColor, GradientPanel.VERTICAL);
labelPanel.setMaximumSize(dimension);
labelPanel.setLayout(new BorderLayout());
spinWidget = new SpinWidget();
spinWidget.setName(label.trim() + ".spinWidget");
labelPanel.add(spinWidget, BorderLayout.LINE_START);
JLabel jlabel = new JLabel(label);
labelPanel.add(jlabel, BorderLayout.CENTER);
labelPanel.setBorder(BorderFactory
.createLineBorder(gradientPanelBorderColor));
add(labelPanel);
add(bottomComponent);
resetBottomVisibility();
}// END: doMyLayout
private void resetBottomVisibility() {
if ((bottomComponent == null) || (spinWidget == null))
return;
bottomComponent.setVisible(spinWidget.isOpen());
revalidate();
}
public void showBottom(boolean b) {
spinWidget.setOpen(b);
}
public boolean isBottomShowing() {
return spinWidget.isOpen();
}
public class SpinWidget extends JPanel {
private final int SPIN_WIDGET_HEIGHT = 15;
private final int HALF_HEIGHT = SPIN_WIDGET_HEIGHT / 2;
private Dimension mySize = new Dimension(SPIN_WIDGET_HEIGHT,
SPIN_WIDGET_HEIGHT);
private boolean open;
private boolean mouseOver;
private int[] openXPoints = { 1, HALF_HEIGHT, SPIN_WIDGET_HEIGHT - 1 };
private int[] openYPoints = { HALF_HEIGHT, SPIN_WIDGET_HEIGHT - 1,
HALF_HEIGHT };
private int[] closedXPoints = { 1, 1, HALF_HEIGHT };
private int[] closedYPoints = { 1, SPIN_WIDGET_HEIGHT - 1, HALF_HEIGHT };
private Polygon openTriangle = new Polygon(openXPoints, openYPoints, 3);
private Polygon closedTriangle = new Polygon(closedXPoints,
closedYPoints, 3);
public SpinWidget() {
setOpen(false);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
handleClick();
}
public void mouseEntered(MouseEvent e) {
handleMouseOver();
}
public void mouseExited(MouseEvent e) {
handleMouseOver();
}
});
}
public void handleClick() {
setOpen(!isOpen());
}
public boolean isOpen() {
return open;
}
public void setOpen(boolean o) {
open = o;
resetBottomVisibility();
}
public void handleMouseOver() {
setIsMouseOver(!isMouseOver());
}
public boolean isMouseOver() {
return mouseOver;
}
public void setIsMouseOver(boolean o) {
mouseOver = o;
repaint();
}
public Dimension getMinimumSize() {
return mySize;
}
public Dimension getPreferredSize() {
return mySize;
}
public void paint(Graphics g) {
if (!isMouseOver()) {
g.setColor(SpinWidgetColor);
} else {
g.setColor(SpinWidgetColor.darker());
}
if (isOpen()) {
// TODO: animate opening here
g.fillPolygon(openTriangle);
} else {
// TODO: animate closing here
g.fillPolygon(closedTriangle);
}
}// END: paint
}// END: SpinWidget class
}// END: class