/*******************************************************************************
 * 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;

/**
 * A frame border for a tabbed window
 * 
 */
/* package */final 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) }));

    /**
     * A border scheme
     * 
     */
    private static class MySchemeBorder extends SchemeBorder
    {
        private static class MyScheme extends SchemeBorder.Scheme
        {
            /**
             * @param highlight
             * @param shadow
             */
            public MyScheme(final Color[] highlight, final Color[] shadow)
            {
                super(highlight, shadow);
            }

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

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

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

        /**
         * @return the scheme
         */
        public MyScheme getMyScheme()
        {
            return (MyScheme) super.getScheme();
        }

        /**
         * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
         * @param comp
         * @param gc
         * @param insets
         */
        public void paint(final Composite comp, final GC gc, final Insets insets)
        {
            final Color[] tl = getMyScheme().getHighlight();
            final 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 comp
         *            the composit whose rect should be used for the inset
         *            bounds
         * @param gc
         *            the graphics object
         * @param insets
         *            the insets
         * @param tl
         *            the highlight (top/left) colors
         * @param br
         *            the shadow (bottom/right) colors
         */
        protected void paint(final Composite comp, final GC gc, final Insets insets, final Color[] tl,
                final Color[] br)
        {
            final org.eclipse.swt.graphics.Rectangle rect = comp.getBounds();

            gc.setLineWidth(1);
            gc.setLineStyle(SWT.LINE_SOLID);

            final int top = rect.y - insets.top;
            final 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));

            final 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();
        }
    }

    /**
     * @param parent
     */
    public TabbedWindowBorder(final 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;
    }

    /**
     * @param flag
     */
    public void setVisible(final boolean flag)
    {
        if (isVisible != flag)
        {
            isVisible = flag;
            ((TabbedTitleBarBorder) inner).setVisible(flag);
            if (flag)
            {
                ((TabbedTitleBarBorder) inner).getParent().repaint();
            }
        }
    }

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

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

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

    private Composite comp;

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