/*******************************************************************************
 * Copyright (c) 2009 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.ptp.services.ui.views;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.ptp.services.core.IServiceConfiguration;
import org.eclipse.ptp.services.core.IServiceModelEvent;
import org.eclipse.ptp.services.core.IServiceModelEventListener;
import org.eclipse.ptp.services.core.IServiceModelManager;
import org.eclipse.ptp.services.core.ServiceModelManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.ViewPart;

public class ServiceConfigurationView extends ViewPart {

	/**
	 * Listener for service configuration selection events.
	 */
	private class ServiceModelEventListener implements IServiceModelEventListener {
		public void handleEvent(IServiceModelEvent event) {
			refreshViewer();
		}
	}
	
	private class ServiceConfigurationLabelProvider extends WorkbenchLabelProvider {
		
		private Font selectedFont;
		private Font unSelectedFont;
		
		public ServiceConfigurationLabelProvider(Font font) {
			unSelectedFont = font;
			FontData fd = font.getFontData()[0];
			FontData selectedFontData = new FontData(fd.getName(), fd.getHeight(), SWT.BOLD);
			selectedFont = (Font)new LocalResourceManager(JFaceResources.getResources()).get(FontDescriptor.createFrom(selectedFontData));
		}

		/* (non-Javadoc)
		 * @see org.eclipse.ui.model.WorkbenchLabelProvider#getFont(java.lang.Object)
		 */
		@Override
		public Font getFont(Object element) {
			IServiceConfiguration conf = getServiceConfiguration(element);
			if (conf != null && conf == fManager.getActiveConfiguration()) {
				return selectedFont;
			}
			return unSelectedFont;
		}
		
		private IServiceConfiguration getServiceConfiguration(Object parentElement) {
			IServiceConfiguration conf = null;
			if (parentElement instanceof IAdaptable) {
				conf = (IServiceConfiguration) ((IAdaptable) parentElement).getAdapter(IServiceConfiguration.class);
			}
			return conf;
		}
	}

	private TreeViewer fViewer;
	private IServiceModelManager fManager = ServiceModelManager.getInstance();

	public ServiceConfigurationView() {
		fManager.addEventListener(new ServiceModelEventListener(), 
				IServiceModelEvent.SERVICE_CONFIGURATION_SELECTED |
				IServiceModelEvent.SERVICE_CONFIGURATION_ADDED |
				IServiceModelEvent.SERVICE_CONFIGURATION_REMOVED);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
	 */
	public void createPartControl(Composite parent) {
		fViewer = new TreeViewer(parent, SWT.MULTI);
		fViewer.setContentProvider(new WorkbenchContentProvider());
		fViewer.setLabelProvider(new ServiceConfigurationLabelProvider(fViewer.getTree().getFont()));

		fViewer.setInput(ServiceModelManager.getInstance());

		createContextMenu();

		// ----------------------------------------------------------------------
		// Enable property sheet updates when tree items are selected.
		// Note for this to work each item in the tree must either implement
		// IPropertySource, or support IPropertySource.class as an adapter type
		// in its AdapterFactory.
		// ----------------------------------------------------------------------
		getSite().setSelectionProvider(fViewer);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
	 */
	public synchronized void dispose() {
		super.dispose();
	}

	public Font getFont() {
		if (fViewer == null) {
			return null;
		}
		return fViewer.getTree().getFont();
	}

	/**
	 * Refresh the tree viewer when the model changes
	 */
	public void refreshViewer() {
		fViewer.getControl().getDisplay().asyncExec(new Runnable(){
			public void run() {
				fViewer.refresh();
			}
		});
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
	 */
	public void setFocus() {
		fViewer.getControl().setFocus();
	}
	
	/**
	 * Create the popup menu
	 */
	private void createContextMenu() {
		MenuManager menuManager = new MenuManager("#PopupMenu", "org.eclipse.ptp.services.ui.views.serviceConfigurationView.contextMenu"); //$NON-NLS-1$
		menuManager.setRemoveAllWhenShown(true);
		Menu menu = menuManager.createContextMenu(fViewer.getControl());
		fViewer.getControl().setMenu(menu);
		getSite().registerContextMenu(menuManager, fViewer);
	}
}
