/*
 * Copyright (c) 2001-2005, Gaudenz Alder
 * 
 * All rights reserved. 
 * 
 * This file is licensed under the JGraph software license, a copy of which
 * will have been provided to you in the file LICENSE at the root of your
 * installation directory. If you are unable to locate this file please
 * contact JGraph sales for another copy.
 */
package io.github.contractautomata.catapp;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.io.Serializable;

import javax.swing.border.Border;

/**
 * Border with a drop shadow.
 */
public class ShadowBorder implements Border, Serializable
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 6854989457150641240L;

	private final Insets insets;

	public static final ShadowBorder sharedInstance = new ShadowBorder();

	private ShadowBorder()
	{
		insets = new Insets(0, 0, 2, 2);
	}

	public Insets getBorderInsets(Component c)
	{
		return insets;
	}

	public boolean isBorderOpaque()
	{
		return false;
	}

	public void paintBorder(Component c, Graphics g, int x, int y, int w, int h)
	{
		// choose which colors we want to use
		Color bg = c.getBackground();

		if (c.getParent() != null)
		{
			bg = c.getParent().getBackground();
		}

		if (bg != null)
		{
			Color mid = bg.darker();
			Color edge = average(mid, bg);

			g.setColor(bg);
			g.drawLine(0, h - 2, w, h - 2);
			g.drawLine(0, h - 1, w, h - 1);
			g.drawLine(w - 2, 0, w - 2, h);
			g.drawLine(w - 1, 0, w - 1, h);

			// draw the drop-shadow
			g.setColor(mid);
			g.drawLine(1, h - 2, w - 2, h - 2);
			g.drawLine(w - 2, 1, w - 2, h - 2);

			g.setColor(edge);
			g.drawLine(2, h - 1, w - 2, h - 1);
			g.drawLine(w - 1, 2, w - 1, h - 2);
		}
	}

	private static Color average(Color c1, Color c2)
	{
		int red = c1.getRed() + (c2.getRed() - c1.getRed()) / 2;
		int green = c1.getGreen() + (c2.getGreen() - c1.getGreen()) / 2;
		int blue = c1.getBlue() + (c2.getBlue() - c1.getBlue()) / 2;
		return new Color(red, green, blue);
	}

	public static ShadowBorder getSharedInstance()
	{
		return sharedInstance;
	}
}
