Package org.eclipse.ui.internal.contexts

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

/*******************************************************************************
* Copyright (c) 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.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.commands.contexts.Context;
import org.eclipse.core.commands.contexts.IContextManagerListener;
import org.eclipse.core.expressions.Expression;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISourceProvider;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.internal.expressions.AndExpression;

/**
* A context service which delegates almost all responsibility to the parent
* service.
* <p>
* This class is not intended for use outside of the
* <code>org.eclipse.ui.workbench</code> plug-in.
* </p>
*
* @since 3.2
*
*/
public class SlaveContextService implements IContextService {

  /**
   * The parent context service, which is never <code>null</code>.
   */
  protected IContextService fParentService;

  /**
   * The default expression used when {@link #activateContext(String) } is
   * called. Contexts contributed that use this expression will only be active
   * with this service is active.
   */
  protected Expression fDefaultExpression;

  /**
   * Our contexts that are currently active with the parent context service.
   */
  protected Set fParentActivations;

  /**
   * A map of the local activation to the parent activations. If this service
   * is inactive, then all parent activations are <code>null</code>.
   * Otherwise, they point to the corresponding activation in the parent
   * service.
   */
  protected Map fLocalActivations;

  /**
   * A collection of context manager listeners. The listeners are not
   * activated/deactivated, but they will be removed when this service is
   * disposed.
   */
  private Collection fContextManagerListeners;

  /**
   * A collection of source providers. The listeners are not
   * activated/deactivated, but they will be removed when this service is
   * disposed.
   */
  private Collection fSourceProviders;

  /**
   * A collection of shells registered through this service. The listeners are
   * not activated/deactivated, but they will be removed when this service is
   * disposed.
   */
  private Collection fRegisteredShells;

  /**
   * Construct the new slave.
   *
   * @param parentService
   *            the parent context service; must not be <code>null</code>.
   * @param defaultExpression
   *            A default expression to use to determine viability. It's
   *            mainly used for conflict resolution. It can be
   *            <code>null</code>.
   */
  public SlaveContextService(IContextService parentService,
      Expression defaultExpression) {
    if (parentService == null) {
      throw new NullPointerException(
          "The parent context service must not be null"); //$NON-NLS-1$
    }
    fParentService = parentService;
    fDefaultExpression = defaultExpression;
    fParentActivations = new HashSet();
    fLocalActivations = new HashMap();
    fContextManagerListeners = new ArrayList();
    fSourceProviders = new ArrayList();
    fRegisteredShells = new ArrayList();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#activateContext(java.lang.String)
   */
  public IContextActivation activateContext(String contextId) {
    ContextActivation activation = new ContextActivation(contextId,
        fDefaultExpression, this);
    return doActivateContext(activation);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#activateContext(java.lang.String,
   *      org.eclipse.core.expressions.Expression)
   */
  public IContextActivation activateContext(String contextId,
      Expression expression) {
    return activateContext(contextId, expression, false);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#activateContext(java.lang.String,
   *      org.eclipse.core.expressions.Expression, boolean)
   */
  public IContextActivation activateContext(String contextId,
      Expression expression, boolean global) {
    if (global) {
      IContextActivation activation = fParentService.activateContext(
          contextId, expression, global);
      fParentActivations.add(activation);
      return activation;
    }
    AndExpression andExpression = null;
    if (expression instanceof AndExpression) {
      andExpression = (AndExpression) expression;
    } else {
      andExpression = new AndExpression();
      if (expression!=null) {
        andExpression.add(expression);
      }
    }
    if (fDefaultExpression!=null) {
      andExpression.add(fDefaultExpression);
    }
    ContextActivation activation = new ContextActivation(contextId,
        andExpression, this);
    return doActivateContext(activation);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#activateContext(java.lang.String,
   *      org.eclipse.core.expressions.Expression, int)
   */
  public IContextActivation activateContext(String contextId,
      Expression expression, int sourcePriorities) {
    return activateContext(contextId, expression);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#addContextManagerListener(org.eclipse.core.commands.contexts.IContextManagerListener)
   */
  public void addContextManagerListener(IContextManagerListener listener) {
    if (!fContextManagerListeners.contains(listener)) {
      fContextManagerListeners.add(listener);
    }
    fParentService.addContextManagerListener(listener);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.services.IServiceWithSources#addSourceProvider(org.eclipse.ui.ISourceProvider)
   */
  public void addSourceProvider(ISourceProvider provider) {
    if (!fSourceProviders.contains(provider)) {
      fSourceProviders.add(provider);
    }
    fParentService.addSourceProvider(provider);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#deactivateContext(org.eclipse.ui.contexts.IContextActivation)
   */
  public void deactivateContext(IContextActivation activation) {
    IContextActivation parentActivation = null;
    if (fLocalActivations.containsKey(activation)) {
      parentActivation = (IContextActivation) fLocalActivations
          .remove(activation);
    } else {
      parentActivation = activation;
    }
    if (parentActivation != null) {
      fParentService.deactivateContext(parentActivation);
      fParentActivations.remove(parentActivation);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#deactivateContexts(java.util.Collection)
   */
  public void deactivateContexts(Collection activations) {
    Object[] array = activations.toArray();
    for (int i = 0; i < array.length; i++) {
      deactivateContext((IContextActivation) array[i]);
      array[i] = null;
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.services.IDisposable#dispose()
   */
  public void dispose() {
    fParentService.deactivateContexts(fParentActivations);
    fParentActivations.clear();
    fLocalActivations.clear();
   
    // Remove any "resource", like listeners, that were associated
    // with this service.
    if (!fContextManagerListeners.isEmpty()) {
      Object[] array = fContextManagerListeners.toArray();
      for (int i = 0; i < array.length; i++) {
        removeContextManagerListener((IContextManagerListener) array[i]);
      }
      fContextManagerListeners.clear();
    }
    if (!fSourceProviders.isEmpty()) {
      Object[] array = fSourceProviders.toArray();
      for (int i = 0; i < array.length; i++) {
        removeSourceProvider((ISourceProvider) array[i]);
      }
      fSourceProviders.clear();
    }
    if (!fRegisteredShells.isEmpty()) {
      Object[] array = fRegisteredShells.toArray();
      for (int i = 0; i < array.length; i++) {
        unregisterShell((Shell) array[i]);
      }
      fRegisteredShells.clear();
    }
  }

  /**
   * Activate the context with respect to this slave service.
   *
   * @param contextId
   *            the context id
   * @param expression
   *            the expression to use
   * @return the activated context
   */
  protected IContextActivation doActivateContext(IContextActivation activation) {
    IContextActivation parentActivation = fParentService.activateContext(
        activation.getContextId(), activation.getExpression());
    fParentActivations.add(parentActivation);
    fLocalActivations.put(activation, parentActivation);
    return activation;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#getActiveContextIds()
   */
  public Collection getActiveContextIds() {
    return fParentService.getActiveContextIds();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#getContext(java.lang.String)
   */
  public Context getContext(String contextId) {
    return fParentService.getContext(contextId);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#getDefinedContextIds()
   */
  public Collection getDefinedContextIds() {
    return fParentService.getDefinedContextIds();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#getDefinedContexts()
   */
  public Context[] getDefinedContexts() {
    return fParentService.getDefinedContexts();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#getShellType(org.eclipse.swt.widgets.Shell)
   */
  public int getShellType(Shell shell) {
    return fParentService.getShellType(shell);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#readRegistry()
   */
  public void readRegistry() {
    fParentService.readRegistry();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#registerShell(org.eclipse.swt.widgets.Shell,
   *      int)
   */
  public boolean registerShell(Shell shell, int type) {
    if (!fRegisteredShells.contains(shell)) {
      fRegisteredShells.add(shell);
    }
    return fParentService.registerShell(shell, type);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#removeContextManagerListener(org.eclipse.core.commands.contexts.IContextManagerListener)
   */
  public void removeContextManagerListener(IContextManagerListener listener) {
    fContextManagerListeners.remove(listener);
    fParentService.removeContextManagerListener(listener);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.services.IServiceWithSources#removeSourceProvider(org.eclipse.ui.ISourceProvider)
   */
  public void removeSourceProvider(ISourceProvider provider) {
    fSourceProviders.remove(provider);
    fParentService.removeSourceProvider(provider);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.contexts.IContextService#unregisterShell(org.eclipse.swt.widgets.Shell)
   */
  public boolean unregisterShell(Shell shell) {
    fRegisteredShells.remove(shell);
    return fParentService.unregisterShell(shell);
  }
}
TOP

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

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.