blob: cd2bebab0d85412cf6f9718119f7c6c1edcf7b5c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Oracle.
* 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:
* Oracle - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.ui.internal.navigator;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jpt.core.JpaPlatform;
import org.eclipse.jpt.core.context.JpaContextNode;
import org.eclipse.jpt.ui.JpaPlatformUi;
import org.eclipse.jpt.ui.JptUiPlugin;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonLabelProvider;
/**
* This extension of navigator label provider delegates to the platform UI
* (see the org.eclipse.jpt.ui.jpaPlatform extension point) for navigator labels.
*
* This label provider provides a label for the root "JPA Content" node provided
* by the content provider (see {@link JpaNavigatorContentProvider}) and delegates
* to the label provider returned by the platform UI implementation for labels
* for children of the "JPA Content" node (or for any other sub-node).
*/
public class JpaNavigatorLabelProvider extends LabelProvider
implements ICommonLabelProvider
{
/**
* Exactly *one* of these is created for each view that utilizes it. Therefore,
* as we delegate to the platform UI for each project, we should maintain the
* same multiplicity. That is, if there is a delegate for each platform UI, we
* should maintain *one* delegate for each view.
*
* Key: platform id, Value: delegate label provider
*/
private Map<String, ICommonLabelProvider> delegateLabelProviders;
private ILabelProviderListener delegateLabelProviderListener;
public JpaNavigatorLabelProvider() {
super();
delegateLabelProviders = new HashMap<String, ICommonLabelProvider>();
delegateLabelProviderListener = new DelegateLabelProviderListener();
}
// **************** IBaseLabelProvider implementation **********************
public void addListener(ILabelProviderListener listener) {
super.addListener(listener);
}
public void removeListener(ILabelProviderListener listener) {
super.removeListener(listener);
}
public boolean isLabelProperty(Object element, String property) {
ICommonLabelProvider delegate = getDelegate(element);
if (delegate != null) {
return delegate.isLabelProperty(element, property);
}
return super.isLabelProperty(element, property);
}
public void dispose() {
super.dispose();
for (ICommonLabelProvider delegate : delegateLabelProviders.values()) {
delegate.dispose();
}
delegateLabelProviders.clear();
}
// **************** ILabelProvider implementation **************************
public Image getImage(Object element) {
ICommonLabelProvider delegate = getDelegate(element);
if (delegate != null) {
return delegate.getImage(element);
}
return super.getImage(element);
}
public String getText(Object element) {
ICommonLabelProvider delegate = getDelegate(element);
if (delegate != null) {
return delegate.getText(element);
}
return super.getText(element);
}
// **************** IDescriptionProvider implementation ********************
public String getDescription(Object element) {
ICommonLabelProvider delegate = getDelegate(element);
if (delegate != null) {
return delegate.getDescription(element);
}
// no "super" implementation - default to getText(..) for description
return super.getText(element);
}
// **************** IMementoAware implementation ***************************
public void saveState(IMemento memento) {
for (ICommonLabelProvider delegate : delegateLabelProviders.values()) {
delegate.saveState(memento);
}
}
public void restoreState(IMemento memento) {
for (ICommonLabelProvider delegate : delegateLabelProviders.values()) {
delegate.restoreState(memento);
}
}
// **************** ICommonLabelProvider implementation ********************
public void init(ICommonContentExtensionSite config) {
for (ICommonLabelProvider delegate : delegateLabelProviders.values()) {
delegate.init(config);
}
}
// *************** internal ************************************************
private ICommonLabelProvider getDelegate(Object element) {
if (! (element instanceof IAdaptable)) {
return null;
}
JpaContextNode contextNode = (JpaContextNode) ((IAdaptable) element).getAdapter(JpaContextNode.class);
if (contextNode == null) {
return null;
}
JpaPlatform platform = contextNode.jpaProject().jpaPlatform();
JpaPlatformUi platformUi = JptUiPlugin.getPlugin().jpaPlatformUi(platform);
ICommonLabelProvider delegate = delegateLabelProviders.get(platform.getId());
if (delegate == null && platform != null && ! delegateLabelProviders.containsKey(platform.getId())) {
delegate = platformUi.buildNavigatorLabelProvider();
delegate.addListener(delegateLabelProviderListener);
delegateLabelProviders.put(platform.getId(), delegate);
}
return delegate;
}
private class DelegateLabelProviderListener
implements ILabelProviderListener
{
public void labelProviderChanged(LabelProviderChangedEvent event) {
fireLabelProviderChanged(event);
}
}
}