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