content: /*******************************************************************************
   * Copyright (c) 2000, 2011 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.jsdt.internal.ui.navigator;
  
  import org.eclipse.core.resources.IContainer;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.runtime.IAdaptable;
  import org.eclipse.jface.util.IPropertyChangeListener;
  import org.eclipse.jface.util.PropertyChangeEvent;
  import org.eclipse.jface.viewers.ILabelDecorator;
  import org.eclipse.jface.viewers.ILabelProviderListener;
  import org.eclipse.swt.graphics.Color;
  import org.eclipse.swt.graphics.Image;
  import org.eclipse.ui.IMemento;
  import org.eclipse.ui.model.IWorkbenchAdapter;
  import org.eclipse.ui.navigator.ICommonContentExtensionSite;
  import org.eclipse.ui.navigator.ICommonLabelProvider;
  import org.eclipse.ui.navigator.IExtensionStateModel;
  import org.eclipse.wst.jsdt.core.IJavaScriptElement;
  import org.eclipse.wst.jsdt.internal.ui.navigator.IExtensionStateConstants.Values;
  import org.eclipse.wst.jsdt.internal.ui.packageview.PackageExplorerContentProvider;
  import org.eclipse.wst.jsdt.internal.ui.packageview.PackageExplorerLabelProvider;
  import org.eclipse.wst.jsdt.internal.ui.packageview.PackageFragmentRootContainer;
  import org.eclipse.wst.jsdt.ui.JavaScriptElementLabels;
  import org.eclipse.wst.jsdt.ui.ProjectLibraryRoot;
  
  /**
   * Provides the labels for the Project Explorer.
   * <p>
   * It provides labels for the packages in hierarchical layout and in all other
   * cases delegates it to its super class.
   * </p>
   * 
   * 
   */
  public class JavaNavigatorLabelProvider implements ICommonLabelProvider {
  
  	private final long LABEL_FLAGS = JavaScriptElementLabels.DEFAULT_QUALIFIED
  			| JavaScriptElementLabels.ROOT_POST_QUALIFIED
  			| JavaScriptElementLabels.APPEND_ROOT_PATH
  			| JavaScriptElementLabels.M_PARAMETER_TYPES
  			| JavaScriptElementLabels.M_PARAMETER_NAMES
  			| JavaScriptElementLabels.M_APP_RETURNTYPE
  			| JavaScriptElementLabels.M_EXCEPTIONS
  			| JavaScriptElementLabels.F_APP_TYPE_SIGNATURE
  			| JavaScriptElementLabels.T_TYPE_PARAMETERS;
  
  	private PackageExplorerLabelProvider delegeteLabelProvider;
  
  	private PackageExplorerContentProvider fContentProvider;
  
  	private IExtensionStateModel fStateModel;
  
  	private IPropertyChangeListener fLayoutPropertyListener;
  
  	public JavaNavigatorLabelProvider() {
  
  	}
  	public void init(ICommonContentExtensionSite commonContentExtensionSite) {
  		fStateModel = commonContentExtensionSite.getExtensionStateModel();
  		fContentProvider = (PackageExplorerContentProvider) commonContentExtensionSite.getExtension().getContentProvider();
  		delegeteLabelProvider = createLabelProvider();
  
  		delegeteLabelProvider.setIsFlatLayout(fStateModel
  				.getBooleanProperty(Values.IS_LAYOUT_FLAT));
  		fLayoutPropertyListener = new IPropertyChangeListener() {
  			public void propertyChange(PropertyChangeEvent event) {
  				if (Values.IS_LAYOUT_FLAT.equals(event.getProperty())) {
  					if (event.getNewValue() != null) {
  						boolean newValue = ((Boolean) event.getNewValue())
  								.booleanValue() ? true : false;
  						delegeteLabelProvider.setIsFlatLayout(newValue);
  					}
  				}
  
  			}
  		};
  		fStateModel.addPropertyChangeListener(fLayoutPropertyListener);
  	}
  
  	public String getDescription(Object element) {
  		return formatMessage(element);
  	}
  
  	private PackageExplorerLabelProvider createLabelProvider() {
  		return new PackageExplorerLabelProvider(fContentProvider);
  	}
  
  	public void dispose() { 
  		delegeteLabelProvider.dispose();
  		fStateModel.removePropertyChangeListener(fLayoutPropertyListener);
  	}
  
  	public void propertyChange(PropertyChangeEvent event) {
  		delegeteLabelProvider.propertyChange(event);
  	}
  
  	public void addLabelDecorator(ILabelDecorator decorator) {
  		delegeteLabelProvider.addLabelDecorator(decorator);
  	}
  
  	public void addListener(ILabelProviderListener listener) {
  		delegeteLabelProvider.addListener(listener);
  	}
  
  	public Color getBackground(Object element) {
  		return delegeteLabelProvider.getBackground(element);
  	}
  
  	public Color getForeground(Object element) {
  		return delegeteLabelProvider.getForeground(element);
  	}
  
  	public Image getImage(Object element) {
  		return delegeteLabelProvider.getImage(element);
  	}
  
  	public boolean isLabelProperty(Object element, String property) {
  		return delegeteLabelProvider.isLabelProperty(element, property);
  	}
  
  	public void removeListener(ILabelProviderListener listener) {
  		delegeteLabelProvider.removeListener(listener);
  	}
  
  	public boolean equals(Object obj) {
  		return delegeteLabelProvider.equals(obj);
  	}
  
  	public int hashCode() {
  		return delegeteLabelProvider.hashCode();
  	}
  
  	public String toString() {
  		return delegeteLabelProvider.toString();
  	}
  
  	public String getText(Object element) {
  		return delegeteLabelProvider.getText(element);
  	}
  
  	public void setIsFlatLayout(boolean state) {
  		delegeteLabelProvider.setIsFlatLayout(state);
  	}
  
  	// Taken from StatusBarUpdater
  
  	private String formatMessage(Object element) {
  		if (element instanceof IJavaScriptElement) {
  			return formatJavaElementMessage((IJavaScriptElement) element);
  		} else if (element instanceof IResource) {
  			return formatResourceMessage((IResource) element);
  		}
  		else if (element instanceof PackageFragmentRootContainer) {
  			return formatPackageFragmentRootContainerMessage((PackageFragmentRootContainer) element);
  		}
  		else if (element instanceof ProjectLibraryRoot) {
  			return formatProjectLibraryRootMessage((ProjectLibraryRoot) element);
  		}
  		if (element instanceof IAdaptable) {
  			IWorkbenchAdapter adapter = (IWorkbenchAdapter) ((IAdaptable) element).getAdapter(IWorkbenchAdapter.class);
  			if (adapter != null) {
  				return adapter.getLabel(element);
  			}
  		}
  		return ""; //$NON-NLS-1$
  	}
  
  	private String formatProjectLibraryRootMessage(ProjectLibraryRoot element) {
  		return element.getText() + JavaScriptElementLabels.CONCAT_STRING + formatJavaElementMessage(element.getProject());
  	}
  
  	private String formatPackageFragmentRootContainerMessage(PackageFragmentRootContainer element) {
  		return element.getLabel() + JavaScriptElementLabels.CONCAT_STRING + formatJavaElementMessage(element.getJavaProject());
  	}
  
  	private String formatJavaElementMessage(IJavaScriptElement element) {
  		return JavaScriptElementLabels.getElementLabel(element, LABEL_FLAGS);
  	}
  
  	private String formatResourceMessage(IResource element) {
  		IContainer parent = element.getParent();
  		if (parent != null && parent.getType() != IResource.ROOT)
  			return element.getName() + JavaScriptElementLabels.CONCAT_STRING
  					+ parent.getFullPath().makeRelative().toString();
  		else
  			return element.getName();
  	}
  	
  	public void restoreState(IMemento memento) { 
  		
  	}
  	
  	public void saveState(IMemento memento) { 
  		
  	}
   
  }
  