/*******************************************************************************
 * Copyright (c) 2001, 2004 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.wst.wsdl.ui.internal.xsd;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.wsdl.XSDSchemaExtensibilityElement;
import org.eclipse.wst.xsd.ui.internal.provider.XSDAdapterFactoryLabelProvider;
import org.eclipse.xsd.XSDSchema;



/**
 * This version of the XSDLabelProvider is a modified version of the one in XSDEditor.
 * This provider only needs to handle nodes in the XML Schema namespace.
 * Other XML nodes (including comments, PIs etc) get handled by the 'main' provider.
 */
public class XSDLabelProvider extends LabelProvider
{
  XSDAdapterFactoryLabelProvider adapterFactoryLabelProvider;
  private static final Class ILabelProviderClass = ILabelProvider.class;
  
  /**
   * Constructor for XSDLabelProvider.
   */
  public XSDLabelProvider(XSDAdapterFactoryLabelProvider adapterFactoryLabelProvider)
  {
    super();
    this.adapterFactoryLabelProvider = adapterFactoryLabelProvider;
  }
  
  /*
   * @see ILabelProvider#getImage(Object)
   */
  public Image getImage(Object element)
  {
    if (element instanceof XSDSchemaExtensibilityElement)
    {
      element = ((XSDSchemaExtensibilityElement)element).getSchema().getElement();
    }
    return adapterFactoryLabelProvider.getImage(element);
  }
    
  /*
   * @see ILabelProvider#getText(Object)
   */
  public String getText(Object element)
  {
    // override text for xsd schema
    if (element instanceof XSDSchema)
    {
      return ((XSDSchema)element).getTargetNamespace();
    }
    else
    {
    	// We don't call "adapterFactoryLabelProvider.getText(element)" because it will return a object.toString() if
    	// there is no labelProvider....  but we don't want to display this 'garbage' info to the user.    	
    	AdapterFactory adapterFactory = adapterFactoryLabelProvider.getAdapterFactory();
        ILabelProvider labelProvider = (ILabelProvider)adapterFactory.adapt(element, ILabelProviderClass);
        String text = "";
        if (labelProvider != null) {
        	text = labelProvider.getText(element);
        }
        
        return text;
    }
  }

}


