/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.integration.navigator;

import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jst.ws.jaxws.dom.integration.internal.plugin.DomIntegrationMessages;
import org.eclipse.jst.ws.jaxws.dom.integration.internal.plugin.DomIntegrationPlugin;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.ILoadingWsProject.ILoadingCanceled;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.ILoadingWsProject.ILoadingDummy;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IServiceEndpointInterface;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebMethod;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebService;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebServiceProject;
import org.eclipse.jst.ws.jaxws.dom.ui.Images;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.navigator.IDescriptionProvider;

/**
 * DOM adapter factory that extends {@link AdapterFactoryLabelProvider} by providing
 * icons and labels for some objects that are not part of DOM and also overrides some
 * labels
 * 
 * @author 
 */
public class DOMAdapterFactoryLabelProvider extends AdapterFactoryLabelProvider implements IDescriptionProvider
{
	/**
	 * Default Constructor uses {@link CustomDomItemProviderAdapterFactory} as default
	 * adapter factory provided to the base class.
	 */
	public DOMAdapterFactoryLabelProvider()
	{
		super(CustomDomItemProviderAdapterFactory.INSTANCE);
		
		DomIntegrationPlugin.getDefault().setLabelProvider(this);
	}

	@Override
	public Image getImage(Object element)
	{
		if(element instanceof IWebServiceChildList)
		{
			return Images.INSTANCE.getImage(Images.IMG_WEB_SERVICE_GROUP);
		}
		else if(element instanceof ISEIChildList)
		{
			return Images.INSTANCE.getImage(Images.IMG_SEI_GROUP);
		}
		else if(element instanceof ILoadingWsProject) 
		{
			return Images.INSTANCE.getImage(Images.IMG_DOM_WS_PROVIDER);
		}
		else if (element instanceof ILoadingDummy || element instanceof ILoadingCanceled) 
		{
			return null;
		}
		
		return super.getImage(element);
	}

	@Override
	public String getText(Object element)
	{
		if(element instanceof IWebServiceProject || element instanceof ILoadingWsProject)
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_JaxWsWebServicesLabel; 
		}
		if (element instanceof ILoadingDummy) 
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_LoadingDummyLabel;
		}
		if (element instanceof ILoadingCanceled) 
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_LoadingCanceledLabel;
		}		
		else if(element instanceof IWebServiceChildList)
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_WebServicesLabel;
		}
		else if(element instanceof ISEIChildList)
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_SeiLabel;
		}
		
		return super.getText(element);
	}
	
	public String getDescription(Object element)
	{
		if(element instanceof IWebService)
		{
			return ((IWebService)element).getName();
		}
		else if(element instanceof IServiceEndpointInterface)
		{
			return ((IServiceEndpointInterface)element).getName();
		}
		else if(element instanceof IWebServiceProject || element instanceof ILoadingWsProject)
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_JaxWsWebServicesLabel;
		}
		else if(element instanceof IWebServiceChildList)
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_WebServicesLabel;
		}
		else if(element instanceof ISEIChildList)
		{
			return DomIntegrationMessages.DOMAdapterFactoryLabelProvider_SeiLabel;
		}
		else if(element instanceof IWebMethod)
		{
			return ((IWebMethod)element).getName();
		}
		
		return super.getText(element);
	}
	
	public void fireLabelProviderChanged(Object element) 
	{
		for (ILabelProviderListener labelProviderListener : labelProviderListeners) {
			labelProviderListener.labelProviderChanged(new LabelProviderChangedEvent(this, element));
		}
	}
	
	@Override
	protected Image getDefaultImage(Object object)
	{
		// No dfault images 
		return null;
	}
}
