/*******************************************************************************
 * Copyright (c) 2011 Laurent CARON
 * 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:
 *     Laurent CARON (laurent.caron at gmail dot com) - Initial implementation and API
 *******************************************************************************/
package org.mihalis.opal.preferenceWindow;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.mihalis.opal.flatButton.FlatButton;
import org.mihalis.opal.utils.SWTGraphicUtil;

/**
 * Instances of this class are a container that allows the user to select a tab.
 */
class PWTabContainer extends Composite {

	/** The tabs. */
	private final List<PWTab> tabs;
	
	/** The container. */
	private Composite container;
	
	/** The old button container image. */
	private Image oldButtonContainerImage;
	
	/** The buttons. */
	private final List<FlatButton> buttons;
	
	/** The button container. */
	private Composite buttonContainer;

	/**
	 * Constructor.
	 *
	 * @param parent parent composite
	 * @param style style (not used)
	 * @param tabs list of tabs
	 */
	PWTabContainer(final Composite parent, final int style, final List<PWTab> tabs) {
		super(parent, style);
		this.tabs = new ArrayList<PWTab>();
		this.tabs.addAll(tabs);

		this.buttons = new ArrayList<FlatButton>();

		final GridLayout gridLayout = new GridLayout(2, false);
		gridLayout.marginWidth = gridLayout.marginHeight = 0;
		gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 0;
		setLayout(gridLayout);

	}

	/**
	 * Build the container.
	 */
	void build() {
		createButtonsContainer();
		createButtons();
		createContentContainer();

		select(PreferenceWindow.getInstance().getSelectedTab());
	}

	/**
	 * Create the buttons container.
	 */
	private void createButtonsContainer() {
		createContainer();
		createButtonsContainerBackground();

	}

	/**
	 * Create the container.
	 */
	private void createContainer() {
		this.buttonContainer = new Composite(this, SWT.NONE);
		final GridData buttonContainerGridData = new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1);
		buttonContainerGridData.heightHint = 63;
		this.buttonContainer.setLayoutData(buttonContainerGridData);

		this.buttonContainer.setBackground(getDisplay().getSystemColor(SWT.COLOR_WHITE));

		final GridLayout gridLayout = new GridLayout(this.tabs.size(), false);
		gridLayout.marginWidth = gridLayout.marginHeight = 0;
		gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 0;
		gridLayout.marginBottom = 2;
		this.buttonContainer.setLayout(gridLayout);
	}

	/**
	 * Create the background of the container.
	 */
	private void createButtonsContainerBackground() {
		this.buttonContainer.addListener(SWT.Resize, new Listener() {

			@Override
			public void handleEvent(final Event event) {
				final Rectangle rect = PWTabContainer.this.buttonContainer.getClientArea();
				final Image image = new Image(getDisplay(), Math.max(1, rect.width), Math.max(1, rect.height));
				final GC gc = new GC(image);
				final Color grey = new Color(getDisplay(), 204, 204, 204);
				gc.setForeground(grey);
				gc.drawLine(0, rect.height - 1, rect.width, rect.height - 1);
				grey.dispose();
				gc.dispose();
				PWTabContainer.this.buttonContainer.setBackgroundImage(image);
				if (PWTabContainer.this.oldButtonContainerImage != null) {
					PWTabContainer.this.oldButtonContainerImage.dispose();
				}
				PWTabContainer.this.oldButtonContainerImage = image;

			}
		});
		SWTGraphicUtil.addDisposer(this.buttonContainer, this.oldButtonContainerImage);
	}

	/**
	 * Create the buttons.
	 */
	private void createButtons() {
		for (int i = 0; i < this.tabs.size(); i++) {
			final PWTab tab = this.tabs.get(i);
			final FlatButton button = new FlatButton(this.buttonContainer, SWT.NONE);
			button.setText(tab.getText());
			button.setImage(tab.getImage());

			final GridData gd;
			if (i == this.tabs.size() - 1) {
				gd = new GridData(GridData.BEGINNING, GridData.BEGINNING, true, false);
			} else {
				gd = new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false);
			}
			if (i == 0) {
				gd.horizontalIndent = 5;
			}
			gd.widthHint = 75;
			button.setLayoutData(gd);

			final int index = i;
			button.addSelectionListener(new SelectionAdapter() {

				/**
				 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
				 */
				@Override
				public void widgetSelected(final SelectionEvent e) {
					select(index);
				}

			});

			this.buttons.add(button);

		}
	}

	/**
	 * Select a given button.
	 *
	 * @param index index of the selected button
	 */
	void select(final int index) {
		for (final Control c : this.container.getChildren()) {
			c.dispose();
		}

		this.tabs.get(index).build(this.container);
		this.container.layout();

		for (int i = 0; i < this.buttons.size(); i++) {
			this.buttons.get(i).setSelection(i == index);
		}
	}

	/**
	 * Create the content container, ie the composite that will contain all
	 * widgets.
	 */
	private void createContentContainer() {
		this.container = new Composite(this, SWT.NONE);
		final GridData tempContainer = new GridData(GridData.FILL, GridData.FILL, true, true, 2, 1);
		tempContainer.widthHint = 700;
		tempContainer.heightHint = 550;
		this.container.setLayoutData(tempContainer);
	}

}
