package com.drawbridge.vl; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.RenderingHints; import javax.swing.JComponent; /*** * Fixed-size transparent popup shape * @author Alistair Stead * */ abstract class Popup extends JComponent { /** * */ private static final long serialVersionUID = 250827727489092754L; public static final int mSliderHeight = 30; private Dimension mPreferredSize = new Dimension(250, 50); private final boolean downwardTriangleVisible; private float transparency; public Popup(boolean downwardTriangleVisible, float transparency){ this.downwardTriangleVisible = downwardTriangleVisible; this.transparency = transparency; } public void setTransparency(float f){ transparency = f; } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int round = (mSliderHeight / 3 * 2); g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transparency)); g2.setColor(Color.white); g2.fillRoundRect(0, 0, getWidth() - 1, mSliderHeight, round, round); g2.setColor(Color.decode("#AAAAAA")); g2.drawRoundRect(0, 0, getWidth() - 1, mSliderHeight, round, round); if(downwardTriangleVisible){ // Draw downward triangle int triangleLength = 10; g2.setColor(Color.white); int centerX = (getWidth() / 2); Point left = new Point(centerX - triangleLength - 5, mSliderHeight); Point middle = new Point(centerX, mSliderHeight + triangleLength); Point right = new Point(centerX + triangleLength + 5, mSliderHeight); g2.drawLine(left.x, left.y, right.x, right.y); Polygon p = new Polygon(); p.addPoint(left.x, left.y); p.addPoint(middle.x, middle.y); p.addPoint(right.x, right.y); g2.fillPolygon(p); g2.setColor(Color.decode("#AAAAAA")); g2.drawLine(left.x, left.y, middle.x, middle.y); g2.drawLine(middle.x, middle.y, right.x, right.y); } } public void setPreferredSize(Dimension size){ mPreferredSize = size; this.setSize(mPreferredSize); } @Override public Dimension getMinimumSize() { return mPreferredSize; } @Override public Dimension getMaximumSize() { return mPreferredSize; } @Override public Dimension getPreferredSize() { return mPreferredSize; } }