/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal.browser;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.ScrollBar;

public abstract class FallbackScrolledComposite extends ScrolledComposite {
    private static final int H_SCROLL_INCREMENT = 5;

    private static final int V_SCROLL_INCREMENT = 64;

    /**
     * Creates the new instance.
     * 
     * @param parent
     *            the parent composite
     * @param style
     *            the style to use
     */
    public FallbackScrolledComposite(Composite parent, int style) {
        super(parent, style);
        addListener(SWT.Resize, new Listener() {
            public void handleEvent(Event e) {
                reflow(true);
            }
        });
        setExpandVertical(true);
        setExpandHorizontal(true);
        initializeScrollBars();
    }

    /**
     * Sets the foreground of the control and its content.
     * 
     * @param fg
     *            the new foreground color
     */
    public void setForeground(Color fg) {
        super.setForeground(fg);
        if (getContent() != null)
            getContent().setForeground(fg);
    }

    /**
     * Sets the background of the control and its content.
     * 
     * @param bg
     *            the new background color
     */
    public void setBackground(Color bg) {
        super.setBackground(bg);
        if (getContent() != null)
            getContent().setBackground(bg);
    }

    /**
     * Sets the font of the form. This font will be used to render the title
     * text. It will not affect the body.
     */
    public void setFont(Font font) {
        super.setFont(font);
        if (getContent() != null)
            getContent().setFont(font);
    }

    /**
     * Overrides 'super' to pass the proper colors and font
     */
    public void setContent(Control content) {
        super.setContent(content);
        if (content != null) {
            content.setForeground(getForeground());
            content.setBackground(getBackground());
            content.setFont(getFont());
        }
    }

    /**
     * If content is set, transfers focus to the content.
     */
    public boolean setFocus() {
        if (getContent() != null)
            return getContent().setFocus();
        return super.setFocus();
    }

    /**
     * Recomputes the body layout and the scroll bars. The method should be used
     * when changes somewhere in the form body invalidate the current layout
     * and/or scroll bars.
     * 
     * @param flushCache
     *            if <code>true</code>, drop the cached data
     */
    public void reflow(boolean flushCache) {
        Composite c = (Composite) getContent();
        Rectangle clientArea = getClientArea();
        if (c == null)
            return;

        Point newSize = c
                .computeSize(clientArea.width, SWT.DEFAULT, flushCache);

        setMinSize(newSize);
        updatePageIncrement();
        layout(flushCache);
    }

    private void updatePageIncrement() {
        ScrollBar vbar = getVerticalBar();
        if (vbar != null) {
            Rectangle clientArea = getClientArea();
            int increment = clientArea.height - 5;
            vbar.setPageIncrement(increment);
        }
    }

    private void initializeScrollBars() {
        ScrollBar hbar = getHorizontalBar();
        if (hbar != null) {
            hbar.setIncrement(H_SCROLL_INCREMENT);
        }
        ScrollBar vbar = getVerticalBar();
        if (vbar != null) {
            vbar.setIncrement(V_SCROLL_INCREMENT);
        }
        updatePageIncrement();
    }
}
