/*******************************************************************************
* 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) {
}
}