Package org.eclipse.ui.internal.contexts

Source Code of org.eclipse.ui.internal.contexts.ContextPersistence

/*******************************************************************************
* Copyright (c) 2005, 2006 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.contexts;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.commands.common.HandleObject;
import org.eclipse.core.commands.contexts.Context;
import org.eclipse.core.commands.contexts.ContextManager;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionDelta;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IRegistryChangeEvent;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
import org.eclipse.ui.internal.services.RegistryPersistence;

/**
* <p>
* A static class for accessing the registry.
* </p>
*
* @since 3.1
*/
final class ContextPersistence extends RegistryPersistence {

  /**
   * The index of the context elements in the indexed array.
   *
   * @see ContextPersistence#read()
   */
  private static final int INDEX_CONTEXT_DEFINITIONS = 0;

  /**
   * Reads all of the command definitions from the commands extension point.
   *
   * @param configurationElements
   *            The configuration elements in the commands extension point;
   *            must not be <code>null</code>, but may be empty.
   * @param configurationElementCount
   *            The number of configuration elements that are really in the
   *            array.
   * @param contextManager
   *            The context manager to which the commands should be added;
   *            must not be <code>null</code>.
   */
  private static final void readContextsFromRegistry(
      final IConfigurationElement[] configurationElements,
      final int configurationElementCount,
      final ContextManager contextManager) {
    // Undefine all the previous handle objects.
    final HandleObject[] handleObjects = contextManager
        .getDefinedContexts();
    if (handleObjects != null) {
      for (int i = 0; i < handleObjects.length; i++) {
        handleObjects[i].undefine();
      }
    }

    final List warningsToLog = new ArrayList(1);

    for (int i = 0; i < configurationElementCount; i++) {
      final IConfigurationElement configurationElement = configurationElements[i];

      // Read out the command identifier.
      final String contextId = readRequired(configurationElement, ATT_ID,
          warningsToLog, "Contexts need an id"); //$NON-NLS-1$
      if (contextId == null) {
        continue;
      }

      // Read out the name.
      final String name = readRequired(configurationElement, ATT_NAME,
          warningsToLog, "Contexts need a name", //$NON-NLS-1$
          contextId);
      if (name == null) {
        continue;
      }

      // Read out the description.
      final String description = readOptional(configurationElement,
          ATT_DESCRIPTION);

      // Read out the parent id.
      String parentId = configurationElement.getAttribute(ATT_PARENT_ID);
      if ((parentId == null) || (parentId.length() == 0)) {
        parentId = configurationElement.getAttribute(ATT_PARENT);
        if ((parentId == null) || (parentId.length() == 0)) {
          parentId = configurationElement
              .getAttribute(ATT_PARENT_SCOPE);
        }
      }
      if ((parentId != null) && (parentId.length() == 0)) {
        parentId = null;
      }

      final Context context = contextManager.getContext(contextId);
      context.define(name, description, parentId);
    }

    logWarnings(
        warningsToLog,
        "Warnings while parsing the contexts from the 'org.eclipse.ui.contexts', 'org.eclipse.ui.commands' and 'org.eclipse.ui.acceleratorScopes' extension points."); //$NON-NLS-1$
  }

  /**
   * The context manager for this instance; must not be <code>null</code>.
   */
  private final ContextManager contextManager;

  /**
   * Constructs a new instance of <code>ContextPersistence</code>.
   */
  ContextPersistence(final ContextManager contextManager) {
    if (contextManager == null) {
      throw new NullPointerException(
          "The context manager must not be null"); //$NON-NLS-1$
    }
    this.contextManager = contextManager;
  }

  protected final boolean isChangeImportant(final IRegistryChangeEvent event) {
    final IExtensionDelta[] acceleratorScopeDeltas = event
        .getExtensionDeltas(PlatformUI.PLUGIN_ID,
            IWorkbenchRegistryConstants.PL_ACCELERATOR_SCOPES);
    if (acceleratorScopeDeltas.length == 0) {
      final IExtensionDelta[] contextDeltas = event.getExtensionDeltas(
          PlatformUI.PLUGIN_ID,
          IWorkbenchRegistryConstants.PL_CONTEXTS);
      if (contextDeltas.length == 0) {
        final IExtensionDelta[] commandDeltas = event
            .getExtensionDeltas(PlatformUI.PLUGIN_ID,
                IWorkbenchRegistryConstants.PL_COMMANDS);
        if (commandDeltas.length == 0) {
          return false;
        }
      }
    }

    return true;
  }

  /**
   * Reads all of the contexts from the registry,
   *
   * @param contextManager
   *            The context manager which should be populated with the values
   *            from the registry; must not be <code>null</code>.
   */
  protected final void read() {
    super.read();

    // Create the extension registry mementos.
    final IExtensionRegistry registry = Platform.getExtensionRegistry();
    int contextDefinitionCount = 0;
    final IConfigurationElement[][] indexedConfigurationElements = new IConfigurationElement[1][];

    /*
     * Retrieve the accelerator scopes from the accelerator scopes extension
     * point.
     */
    final IConfigurationElement[] acceleratorScopesExtensionPoint = registry
        .getConfigurationElementsFor(EXTENSION_ACCELERATOR_SCOPES);
    for (int i = 0; i < acceleratorScopesExtensionPoint.length; i++) {
      final IConfigurationElement configurationElement = acceleratorScopesExtensionPoint[i];
      final String name = configurationElement.getName();

      // Check if it is a binding definition.
      if (TAG_ACCELERATOR_SCOPE.equals(name)) {
        addElementToIndexedArray(configurationElement,
            indexedConfigurationElements,
            INDEX_CONTEXT_DEFINITIONS, contextDefinitionCount++);
      }
    }

    /*
     * Retrieve the deprecated scopes and contexts from the commands
     * extension point.
     */
    final IConfigurationElement[] commandsExtensionPoint = registry
        .getConfigurationElementsFor(EXTENSION_COMMANDS);
    for (int i = 0; i < commandsExtensionPoint.length; i++) {
      final IConfigurationElement configurationElement = commandsExtensionPoint[i];
      final String name = configurationElement.getName();

      // Check if it is a binding definition.
      if (TAG_SCOPE.equals(name)) {
        addElementToIndexedArray(configurationElement,
            indexedConfigurationElements,
            INDEX_CONTEXT_DEFINITIONS, contextDefinitionCount++);
      } else if (TAG_CONTEXT.equals(name)) {
        addElementToIndexedArray(configurationElement,
            indexedConfigurationElements,
            INDEX_CONTEXT_DEFINITIONS, contextDefinitionCount++);

      }
    }

    /*
     * Retrieve the contexts from the contexts extension point.
     */
    final IConfigurationElement[] contextsExtensionPoint = registry
        .getConfigurationElementsFor(EXTENSION_CONTEXTS);
    for (int i = 0; i < contextsExtensionPoint.length; i++) {
      final IConfigurationElement configurationElement = contextsExtensionPoint[i];
      final String name = configurationElement.getName();

      // Check if it is a binding definition.
      if (TAG_CONTEXT.equals(name)) {
        addElementToIndexedArray(configurationElement,
            indexedConfigurationElements,
            INDEX_CONTEXT_DEFINITIONS, contextDefinitionCount++);
      }
    }

    readContextsFromRegistry(
        indexedConfigurationElements[INDEX_CONTEXT_DEFINITIONS],
        contextDefinitionCount, contextManager);
  }

}
TOP

Related Classes of org.eclipse.ui.internal.contexts.ContextPersistence

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.