/*******************************************************************************
 * Copyright (c) 2004, 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.preference;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.FrameBorder;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.SchemeBorder;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Composite;

public class TabbedWindowBorder extends FrameBorder {
	private boolean isVisible = true;

	// CR392586: resource leaks
	private static MySchemeBorder normalBorder = new MySchemeBorder(
			new MySchemeBorder.MyScheme(
					new Color[] { ColorConstants.button,
							ColorConstants.buttonLightest,
							ColorConstants.button },
					new Color[] { ColorConstants.buttonDarkest,
							ColorConstants.buttonDarker, ColorConstants.button }));

	// CR392586: resource leaks
	private static MySchemeBorder highlightBorder = new MySchemeBorder(
			new MySchemeBorder.MyScheme(new Color[] {
					FigureUtilities.lighter(ColorConstants.titleBackground),
					ColorConstants.titleBackground,
					FigureUtilities.darker(ColorConstants.titleBackground) },
					new Color[] {
							FigureUtilities
									.darker(ColorConstants.titleGradient),
							ColorConstants.titleGradient,
							FigureUtilities
									.lighter(ColorConstants.titleGradient) }));

	public static class MySchemeBorder extends SchemeBorder {
		public static class MyScheme extends SchemeBorder.Scheme {
			public MyScheme(Color[] highlight, Color[] shadow) {
				super(highlight, shadow);
			}

			public Color[] getHighlight() {
				return super.getHighlight();
			}

			public Color[] getShadow() {
				return super.getHighlight();
			}
		}

		MySchemeBorder(MyScheme scheme) {
			super(scheme);
		}

		public MyScheme getMyScheme() {
			return (MyScheme) super.getScheme();
		}

		/**
		 * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
		 */
		public void paint(Composite comp, GC gc, Insets insets) {
			Color[] tl = getMyScheme().getHighlight();
			Color[] br = getMyScheme().getShadow();
			paint(comp, gc, insets, tl, br);
		}

		/**
		 * Paints the border using the information in the set Scheme and the
		 * inputs given. Side widths are determined by the number of colors in
		 * the Scheme for each side.
		 * 
		 * @param graphics
		 *            the graphics object
		 * @param fig
		 *            the figure this border belongs to
		 * @param insets
		 *            the insets
		 * @param tl
		 *            the highlight (top/left) colors
		 * @param br
		 *            the shadow (bottom/right) colors
		 */
		protected void paint(Composite comp, GC gc, Insets insets, Color[] tl,
				Color[] br) {
			org.eclipse.swt.graphics.Rectangle rect = comp.getBounds();

			gc.setLineWidth(1);
			gc.setLineStyle(SWT.LINE_SOLID);
			// TODO: deprecated with no obvious replacement: 
			gc.setXORMode(false);

			int top = rect.y - insets.top;
			int left = rect.x - insets.left;
			int bottom = rect.y + rect.height + insets.bottom;
			int right = rect.x + rect.width + insets.right;
			gc.setClipping(new org.eclipse.swt.graphics.Rectangle(left, top,
					right - left, bottom - top));

			Color color = ColorConstants.red;
			gc.setForeground(color);
			gc.drawLine(left, top, right, bottom);

			for (int i = 0; i < br.length; i++) {
				// color = br[i];
				gc.setForeground(color);
				gc.drawLine(right - i, bottom - i, right - i, top + i);
				gc.drawLine(right - i, bottom - i, left + i, bottom - i);
			}

			right--;
			bottom--;

			for (int i = 0; i < tl.length; i++) {
				// color = tl[i];
				gc.setForeground(color);
				gc.drawLine(left + i, top + i, right - i, top + i);
				gc.drawLine(left + i, top + i, left + i, bottom - i);
			}
			color.dispose();
		}
	}

	public TabbedWindowBorder(IFigure parent) {
		// apparently paint() gets called before createBorders() has had
		// a chance to create the borders, so we just create them here
		inner = new TabbedTitleBarBorder(parent);
		outer = normalBorder;
	}

	public void setVisible(boolean flag) {
		if (isVisible != flag) {
			isVisible = flag;
			((TabbedTitleBarBorder) inner).setVisible(flag);
			if (flag)
				((TabbedTitleBarBorder) inner).getParent().repaint();
		}
	}

	public void setHighlight(boolean flag) {
		if (flag)
			outer = highlightBorder;
		else
			outer = normalBorder;
		((TabbedTitleBarBorder) inner).getParent().repaint();
	}

	protected void createBorders() {
        // TODO: NOTE: this is overriding default border creation
	}

	public void paint(IFigure figure, Graphics g, Insets insets) {
		if (isVisible) {
			if (comp != null) {
				GC gc = new GC(comp);
				paint(comp, gc, insets);
				gc.dispose();
			} else
				super.paint(figure, g, insets);
		}
	}

	private Composite comp;

	public void paint(Composite comp_, GC gc, Insets insets) {
		this.comp = comp_;
		if (isVisible)
			((MySchemeBorder) outer).paint(comp_, gc, insets);
	}
}