+package tim.prune.gui.map;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+
+import javax.swing.JPanel;
+
+/**
+ * Semi-transparent panel to go on top of the map
+ * to contain a set of controls
+ */
+public class OverlayPanel extends JPanel
+{
+ // Previous dimensions to see if calculations necessary
+ private int _prevWidth = -1, _prevHeight = -1;
+ // Previously calculated border limits
+ private int _minX, _minY, _width, _height;
+
+ /**
+ * Constructor
+ */
+ public OverlayPanel()
+ {
+ setOpaque(false);
+ }
+
+ /**
+ * Paint the contents
+ */
+ public void paint(Graphics g)
+ {
+ int panelWidth = getWidth();
+ int panelHeight = getHeight();
+ if (panelWidth != _prevWidth || panelHeight != _prevHeight)
+ {
+ calculateBorder();
+ _prevWidth = panelWidth;
+ _prevHeight = panelHeight;
+ }
+ // Draw white background
+ final Color BG = new Color(255, 255, 255, 200);
+ g.setColor(BG);
+ g.fillRect(_minX, _minY, _width, _height);
+ // Draw black border
+ g.setColor(Color.BLACK);
+ g.drawRect(_minX, _minY, _width, _height);
+ // Paint everything else
+ super.paint(g);
+ }
+
+ /**
+ * Calculate the boundaries to paint over
+ */
+ private void calculateBorder()
+ {
+ final int PADDING = 2;
+ // Calculate where the border should be drawn
+ final Component firstComp = getComponent(0);
+ final Component lastComp = getComponent(getComponentCount()-1);
+ _minX = Math.max(firstComp.getX() - PADDING, 0);
+ final int maxX = Math.min(lastComp.getX() + lastComp.getWidth() + PADDING, getWidth()-1);
+ _width = maxX - _minX;
+ _minY = Math.max(Math.min(firstComp.getY(), lastComp.getY()) - PADDING, 0);
+ final int maxY = Math.max(firstComp.getY()+firstComp.getHeight(), lastComp.getY()+lastComp.getHeight()) + PADDING;
+ _height = maxY - _minY;
+ //System.out.println("x from " + minx + " to " + maxx + ", y from " + miny + " to " + maxy);
+ }
+}