/**
 * THE PrettyTabPanel.java WRITEME...
 */
package com.tootsville.tootsbook.client.panel;

import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * WRITEME: Document this type. twheys@gmail.com Feb 23, 2010
 * 
 * @author <a href="mailto:twheys@gmail.com@resinteractive.com">Tim
 *         Heys</a>
 * 
 */
public class PrettyTabPanel extends Composite {

	/**
	 * 
	 */
	protected ChangeHandler changeHandler;
	/**
	 * 
	 */
	private final HorizontalPanel tabBar = new HorizontalPanel ();
	/**
	 * 
	 */
	private final DeckPanel tabs = new DeckPanel ();

	/**
	 * <pre>
	 * twheys@gmail.com Feb 23, 2010
	 * </pre>
	 * 
	 * A PrettyTabPanel WRITEME...
	 * 
	 */
	public PrettyTabPanel () {
		final VerticalPanel panel = new VerticalPanel ();
		initWidget (panel);
		tabBar.setStyleName ("store-tab-bar");
		tabBar.setHorizontalAlignment (HasHorizontalAlignment.ALIGN_CENTER);
		tabBar.setVerticalAlignment (HasVerticalAlignment.ALIGN_MIDDLE);
		panel.add (tabBar);
		panel.add (tabs);
		getElement ().setAttribute ("width", "100%");
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 23, 2010
	 * </pre>
	 * 
	 * TO addTab WRITEME...
	 * 
	 * @param w WRITEME
	 * @param tabTitle WRITEME
	 */
	public void addTab (final Widget w, final String tabTitle) {
		tabs.add (w);
		final int tabIndex = tabs.getWidgetIndex (w);
		final Anchor a = generateLink (tabTitle, tabIndex);
		a.setStyleName ("primary-text invis-border");
		tabBar.add (a);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 23, 2010
	 * </pre>
	 * 
	 * TO generateLink WRITEME...
	 * 
	 * @param linkText WRITEME
	 * @param tabIndex WRITEME
	 * @return WRITEME
	 */
	private Anchor generateLink (final String linkText,
			final int tabIndex) {
		final Anchor a = new Anchor (linkText, "javascript:;");
		a.addClickHandler (new ClickHandler () {
			@Override
			public void onClick (final ClickEvent event) {
				History.newItem ("store?id=" + tabIndex);
			}
		});
		return a;
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 24, 2010
	 * </pre>
	 * 
	 * TO getVisibleWidget WRITEME...
	 * 
	 * @return WRITEME
	 */
	public Widget getVisibleWidget () {
		final int index = tabs.getVisibleWidget ();
		return tabs.getWidget (index);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 25, 2010
	 * </pre>
	 * 
	 * TO getWidget WRITEME...
	 * 
	 * @param index WRITEME
	 * @return WRITEME
	 */
	public Widget getWidget (final int index) {
		return tabs.getWidget (index);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Mar 1, 2010
	 * </pre>
	 * 
	 * TO highlightTab WRITEME...
	 * 
	 * @param index WRITEME
	 */
	private void highlightTab (final int index) {
		final int widgets = tabBar.getWidgetCount () - 1;
		for (int iterator = 0; iterator <= widgets; iterator++ ) {
			final Widget w = tabBar.getWidget (iterator);
			if (null != w && iterator == index) {
				w.addStyleName ("store-tab-selected comment-bg-color");
			} else if (null != w) {
				w.removeStyleName ("store-tab-selected comment-bg-color");
			}
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 23, 2010
	 * </pre>
	 * 
	 * TO selectTab WRITEME...
	 * 
	 * @param index WRITEME
	 */
	public void selectTab (final int index) {
		try {
			tabs.showWidget (index);
			highlightTab (index);
		} catch (final IndexOutOfBoundsException e) {
			// no op
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 25, 2010
	 * </pre>
	 * 
	 * TO addChangeHandler WRITEME...
	 * 
	 * @param handler WRITEME
	 */
	public void setChangeHandler (final ChangeHandler handler) {
		changeHandler = handler;
	}
}
