blob: dcd6d19d6108a0028982515b5284d516c591c332 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2007 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.ui.internal.navigator.extensions;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
import org.eclipse.ui.internal.navigator.NavigatorPlugin;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
import org.eclipse.ui.navigator.MenuInsertionPoint;
import org.eclipse.ui.navigator.NavigatorActionService;
/**
* Encapsulates the <code>org.eclipse.ui.navigator.viewer</code> extension.
* <p>
*
* @since 3.2
*/
public final class NavigatorViewerDescriptor implements
INavigatorViewerDescriptor {
/**
* {@value} (boolean): True indicates the ITreeContentProvider.hasChildren()
* should force plugins to load if necessary <b>false</b>).
*/
public static final String PROP_ENFORCE_HAS_CHILDREN = "org.eclipse.ui.navigator.enforceHasChildren"; //$NON-NLS-1$
static final String TAG_INCLUDES = "includes"; //$NON-NLS-1$
static final String TAG_EXCLUDES = "excludes"; //$NON-NLS-1$
static final String ATT_IS_ROOT = "isRoot"; //$NON-NLS-1$
static final String ATT_PATTERN = "pattern"; //$NON-NLS-1$
private static final String TAG_CONTENT_EXTENSION = "contentExtension"; //$NON-NLS-1$
private static final String TAG_ACTION_EXTENSION = "actionExtension"; //$NON-NLS-1$
private final String viewerId;
private String popupMenuId = null;
private Binding actionBinding = new Binding(TAG_ACTION_EXTENSION);
private Binding contentBinding = new Binding(TAG_CONTENT_EXTENSION);
private MenuInsertionPoint[] customInsertionPoints = null;
private boolean allowsPlatformContributions = true;
private final Properties properties = new Properties();
private Set dragAssistants;
/**
* Creates a new content descriptor from a configuration element.
*
* @param aViewerId
* The identifier for this descriptor.
*/
/* package */NavigatorViewerDescriptor(String aViewerId) {
super();
this.viewerId = aViewerId;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.navigator.extensions.INavigatorViewerDescriptor#getViewerId()
*/
public String getViewerId() {
return viewerId;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.navigator.extensions.INavigatorViewerDescriptor#getPopupMenuId()
*/
public String getPopupMenuId() {
return popupMenuId != null ? popupMenuId : viewerId;
}
/**
* Consume an action binding for this viewer.
*
* @param element
* The IConfigurationElement containing a viewerActionBinding
* element.
*/
public void consumeActionBinding(IConfigurationElement element) {
consumeBinding(element, false);
}
/**
* Consume a content binding for this viewer.
*
* @param element
* The IConfigurationElement containing a viewerContentBinding
* element.
*/
public void consumeContentBinding(IConfigurationElement element) {
consumeBinding(element, true);
}
public boolean isRootExtension(String aContentExtensionId) {
return contentBinding.isRootExtension(aContentExtensionId);
}
public boolean allowsPlatformContributionsToContextMenu() {
return allowsPlatformContributions;
}
public boolean isVisibleContentExtension(String aContentExtensionId) {
return contentBinding.isVisibleExtension(aContentExtensionId);
}
public boolean isVisibleActionExtension(String anActionExtensionId) {
return actionBinding.isVisibleExtension(anActionExtensionId);
}
public boolean hasOverriddenRootExtensions() {
return contentBinding.hasOverriddenRootExtensions();
}
public MenuInsertionPoint[] getCustomInsertionPoints() {
return customInsertionPoints;
}
/**
*
* @param newCustomInsertionPoints
* The set of custom insertion points, if any. A null list
* indicates the default set (as defined by
* {@link NavigatorActionService}) should be used. An empty list
* indicates there are no declarative insertion points.
*/
public void setCustomInsertionPoints(
MenuInsertionPoint[] newCustomInsertionPoints) {
if (customInsertionPoints != null) {
NavigatorPlugin
.logError(
0,
"Attempt to override custom insertion points denied. Verify there are no colliding org.eclipse.ui.navigator.viewer extension points.", null); //$NON-NLS-1$
return; // do not let them override the insertion points.
}
customInsertionPoints = newCustomInsertionPoints;
}
/**
*
* @param toAllowPlatformContributions
* A value of 'true' enables object/viewer contributions. 'false'
* will only allow programmatic contributions from
* {@link CommonActionProvider}s.
*/
public void setAllowsPlatformContributions(
boolean toAllowPlatformContributions) {
allowsPlatformContributions = toAllowPlatformContributions;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.navigator.INavigatorViewerDescriptor#getStringConfigProperty(java.lang.String)
*/
public String getStringConfigProperty(String aPropertyName) {
return properties.getProperty(aPropertyName);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.navigator.INavigatorViewerDescriptor#getBooleanConfigProperty(java.lang.String)
*/
public boolean getBooleanConfigProperty(String aPropertyName) {
String propValue = properties.getProperty(aPropertyName);
if (propValue == null) {
return false;
}
return Boolean.valueOf(propValue).booleanValue();
}
/* package */ void setProperty(String aPropertyName, String aPropertyValue) {
properties.setProperty(aPropertyName, aPropertyValue);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
return "ViewerDescriptor[" + viewerId + "]"; //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Update the popupMenuId. If a value is already set, then a warning message
* will be logged.
*
* @param newPopupMenuId
* The new popup menu id.
*/
/* package */ void setPopupMenuId(String newPopupMenuId) {
if (newPopupMenuId != null) {
if (popupMenuId != null) {
NavigatorPlugin
.log(
IStatus.WARNING,
0,
NLS
.bind(
CommonNavigatorMessages.NavigatorViewerDescriptor_Popup_Menu_Overridden,
new Object[] { getViewerId(),
popupMenuId,
newPopupMenuId }), null);
}
popupMenuId = newPopupMenuId;
}
}
/**
* @param descriptor
* A non-null descriptor to add
*/
/* package */ void addDragAssistant(CommonDragAssistantDescriptor descriptor) {
getDragAssistants().add(descriptor);
}
/**
*
* @return The set of {@link CommonDragAssistantDescriptor}s for this
* viewer.
*/
public Set getDragAssistants() {
if (dragAssistants == null) {
dragAssistants = new HashSet();
}
return dragAssistants;
}
private void consumeBinding(IConfigurationElement element, boolean isContent) {
IConfigurationElement[] includesElement = element
.getChildren(TAG_INCLUDES);
if (includesElement.length == 1) {
if (isContent) {
contentBinding.consumeIncludes(includesElement[0], true);
} else {
actionBinding.consumeIncludes(includesElement[0], false);
}
} else if (includesElement.length >= 1) {
NavigatorPlugin.logError(0, NLS.bind(
CommonNavigatorMessages.Too_many_elements_Warning,
new Object[] {
TAG_INCLUDES,
element.getDeclaringExtension()
.getUniqueIdentifier(),
element.getDeclaringExtension().getNamespaceIdentifier() }),
null);
}
IConfigurationElement[] excludesElement = element
.getChildren(TAG_EXCLUDES);
if (excludesElement.length == 1) {
if (isContent) {
contentBinding.consumeExcludes(excludesElement[0]);
} else {
actionBinding.consumeExcludes(excludesElement[0]);
}
} else if (excludesElement.length >= 1) {
NavigatorPlugin.logError(0, NLS.bind(
CommonNavigatorMessages.Too_many_elements_Warning,
new Object[] {
TAG_EXCLUDES,
element.getDeclaringExtension()
.getUniqueIdentifier(),
element.getDeclaringExtension().getNamespaceIdentifier() }),
null);
}
}
}