/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.carbide.internal.discovery.ui.editor;

import java.util.LinkedHashMap;
import java.util.Map;

import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;

import com.nokia.cpp.internal.api.utils.core.ListenerList;

class NavigationBar extends RoundedCornerComposite {
	private class Button extends CLabel {
		private ListenerList<SelectionListener> listeners;
		private boolean selection;
		private MouseTrackListener mouseTrackListener;
		private MouseListener mouseListener;
		
		public Button(Composite parent) {
			super(parent, SWT.CENTER);
			listeners = new ListenerList<SelectionListener>();
			setBackground(getDisplay().getSystemColor(SWT.COLOR_WHITE));
			addMouseTrackListener(mouseTrackListener = new MouseTrackAdapter() {
				@Override
				public void mouseExit(MouseEvent e) {
					if (!selection)
						updateUI();
					
				}
				
				@Override
				public void mouseEnter(MouseEvent e) {
					if (!selection)
						setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
				}
			});
			
			addMouseListener(mouseListener = new MouseAdapter() {
				@Override
				public void mouseUp(MouseEvent e) {
					Point size = Button.this.getSize();
					if (new Rectangle(0, 0, size.x, size.y).contains(e.x, e.y))
						setSelection(true);
				}
			});
		}
		
		@Override
		protected void checkSubclass() {
		}

		public void addSelectionListener(SelectionListener listener) {
			listeners.add(listener);
		}

		public void setSelection(boolean selection) {
			if (this.selection != selection) {
				this.selection = selection;
				updateUI();
				if (selection) {
					for (Control control : getParent().getChildren()) {
						if (control instanceof Button) {
							if (!control.equals(this)) {
								((Button) control).setSelection(false);
							}
						}
					}
					fireSelection();
				}
			}
		}

		private void fireSelection() {
			Event e = new Event();
			e.widget = this;
			e.display = getDisplay();
			for (SelectionListener listener : listeners) {
				listener.widgetSelected(new SelectionEvent(e));
			}
			
		}

		private void updateUI() {
			setBackground(getDisplay().getSystemColor(selection ? SWT.COLOR_WIDGET_NORMAL_SHADOW : SWT.COLOR_WHITE));
			setFont(selection ? selectedButtonFont : buttonFont);
		}
		
		@Override
		public void dispose() {
			removeMouseTrackListener(mouseTrackListener);
			removeMouseListener(mouseListener);
			super.dispose();
		}
	}

	private final class ButtonListener extends SelectionAdapter {
		@Override
		public void widgetSelected(SelectionEvent e) {
			Button button = (Button) e.getSource();
			selectNavButton(button);
		}
	}

	private static final int BUTTON_SPACING = 0;
	private PortalEditor portalEditor;
	private Map<Button, PortalPage> buttonToPageMap;
	private SelectionListener listener;
	private Font buttonFont;
	private Font selectedButtonFont;
	
	NavigationBar(PortalEditor portalEditor, Composite parent) {
		super(parent, portalEditor.getBackgroundParent(), null, null);
		this.portalEditor = portalEditor;
		buttonToPageMap = new LinkedHashMap<Button, PortalPage>();
		FillLayout layout = new FillLayout(SWT.HORIZONTAL);
		layout.spacing = BUTTON_SPACING;
		layout.marginHeight = BUTTON_SPACING;
		layout.marginWidth = BUTTON_SPACING;
		setLayout(layout);
		listener = new ButtonListener();
		selectedButtonFont = JFaceResources.getHeaderFont();
		FontData[] fontData = selectedButtonFont.getFontData();
		for (FontData fd : fontData) {
			fd.setStyle(SWT.NORMAL);
		}
		FontDescriptor desc = FontDescriptor.createFrom(fontData);
		buttonFont = portalEditor.createFont(desc);
	}

	public void initUI() {
		if (buttonToPageMap.isEmpty())
			return;
		buttonToPageMap.keySet().iterator().next().setSelection(true);
	}

	public void addNavButton(NavigationBar bar, PortalPage page) {
		Button b = new Button(bar);
		b.setFont(buttonFont);
		b.setText(page.getTitle());
		b.setToolTipText(page.getTooltip());
		b.setImage(portalEditor.createImage(page.getImageDescriptor(), 32, 32));
		b.addSelectionListener(listener);
		buttonToPageMap.put(b, page);
	}


	public void selectNavButton(Button button) {
		portalEditor.showPage(buttonToPageMap.get(button));
		layout();
	}
}