Package org.eclipse.ui.internal.contexts

Source Code of org.eclipse.ui.internal.contexts.ContextManagerLegacyWrapper$DepthSortedContextIdSet

/*******************************************************************************
* 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.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.commands.contexts.Context;
import org.eclipse.core.commands.contexts.ContextManager;
import org.eclipse.ui.contexts.ContextManagerEvent;
import org.eclipse.ui.contexts.IContext;
import org.eclipse.ui.contexts.IContextManager;
import org.eclipse.ui.contexts.IContextManagerListener;

/**
* A wrapper around the new API that supports the old API. This manager also
* adds support for reading from the registry.
*
* @since 3.1
*/
public final class ContextManagerLegacyWrapper implements
    org.eclipse.core.commands.contexts.IContextManagerListener,
    IContextManager {

  /**
   * A comparator between context identifiers, that sorts them based on depth
   * within the tree. Context identifiers representing deeper items (i.e.,
   * items with more ancestors), have lesser values (i.e., would appear
   * earlier in a set).
   *
   * @since 3.0
   */
  private class ContextIdDepthComparator implements Comparator {

    /**
     * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
     */
    public final int compare(final Object object1, final Object object2) {
      final String contextId1 = (String) object1;
      final String contextId2 = (String) object2;
      Context context;
      String parentId;

      // Get the depth of the first context.
      int depth1 = 0;
      context = contextManager.getContext(contextId1);
      try {
        parentId = context.getParentId();
        while (parentId != null) {
          depth1++;
          context = contextManager.getContext(parentId);
          parentId = context.getParentId();
        }
      } catch (final NotDefinedException e) {
        // Do nothing. Stop ascending the ancestry.
      }

      // Get the depth of the second context.
      int depth2 = 0;
      context = contextManager.getContext(contextId2);
      try {
        parentId = context.getParentId();
        while (parentId != null) {
          depth2++;
          context = contextManager.getContext(parentId);
          parentId = context.getParentId();
        }
      } catch (final NotDefinedException e) {
        // Do nothing. Stop ascending the ancestry.
      }

      // If the contexts are equal depth, then use their identifier.
      int compare = depth2 - depth1;
      if (compare == 0) {
        compare = contextId1.compareTo(contextId2);
      }

      return compare;
    }
  }

  /**
   * A set that contains context identifiers (strings). The set is sorted
   * based on how many ancestors the corresponding contexts have. Contexts
   * with no parents appear last, while contexts with the most ancestors
   * appear first.
   *
   * @since 3.0
   */
  private class DepthSortedContextIdSet extends TreeSet {

    /**
     * Generated serial version UID for this class.
     *
     * @since 3.1
     */
    private static final long serialVersionUID = 3257291326872892465L;

    /**
     * Constructs a new instance of <code>DepthSortedContextIdSet</code>
     * with the set to be sorted.
     *
     * @param contextIds
     *            A set of context identifiers (strings); this may contain
     *            <code>null</code> values. The set may not be
     *            <code>null</code>, but may be empty.
     */
    private DepthSortedContextIdSet(final Set contextIds) {
      super(new ContextIdDepthComparator());
      addAll(contextIds);
    }
  }

  private final ContextManager contextManager;

  private List contextManagerListeners;

  /**
   * Constructs a new instance of <code>MutableContextManager</code>. The
   * registry is created on the platform's extension registry.
   *
   * @param contextManager
   *            The manager which will provided the real support; must not be
   *            <code>null</code>.
   */
  public ContextManagerLegacyWrapper(ContextManager contextManager) {

    if (contextManager == null) {
      throw new NullPointerException("The context manager cannot be null"); //$NON-NLS-1$
    }

    this.contextManager = contextManager;
    this.contextManager.addContextManagerListener(this);
  }

  public void addContextManagerListener(
      IContextManagerListener contextManagerListener) {
    if (contextManagerListener == null) {
      throw new NullPointerException();
    }

    if (contextManagerListeners == null) {
      contextManagerListeners = new ArrayList();
    }

    if (!contextManagerListeners.contains(contextManagerListener)) {
      contextManagerListeners.add(contextManagerListener);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.core.commands.contexts.IContextManagerListener#contextManagerChanged(org.eclipse.core.commands.contexts.ContextManagerEvent)
   */
  public void contextManagerChanged(
      org.eclipse.core.commands.contexts.ContextManagerEvent contextManagerEvent) {
    final String contextId = contextManagerEvent.getContextId();
    final boolean definedContextsChanged;
    final Set previouslyDefinedContextIds;
    if (contextId == null) {
      definedContextsChanged = false;
      previouslyDefinedContextIds = null;
    } else {
      definedContextsChanged = true;
      previouslyDefinedContextIds = new HashSet();
      previouslyDefinedContextIds.addAll(contextManager
          .getDefinedContextIds());
      if (contextManagerEvent.isContextDefined()) {
        previouslyDefinedContextIds.remove(contextId);
      } else {
        previouslyDefinedContextIds.add(contextId);
      }
    }

    fireContextManagerChanged(new ContextManagerEvent(this,
        definedContextsChanged, contextManagerEvent
            .isActiveContextsChanged(),
        previouslyDefinedContextIds, contextManagerEvent
            .getPreviouslyActiveContextIds()));

  }

  protected void fireContextManagerChanged(
      ContextManagerEvent contextManagerEvent) {
    if (contextManagerEvent == null) {
      throw new NullPointerException();
    }

    if (contextManagerListeners != null) {
      for (int i = 0; i < contextManagerListeners.size(); i++) {
        ((IContextManagerListener) contextManagerListeners.get(i))
            .contextManagerChanged(contextManagerEvent);
      }
    }
  }

  public IContext getContext(String contextId) {
    return new ContextLegacyWrapper(contextManager.getContext(contextId),
        contextManager);
  }

  public SortedSet getDefinedContextIds() {
    return new DepthSortedContextIdSet(contextManager
        .getDefinedContextIds());
  }

  public SortedSet getEnabledContextIds() {
    return new DepthSortedContextIdSet(contextManager.getActiveContextIds());
  }

  public void removeContextManagerListener(
      IContextManagerListener contextManagerListener) {
    if (contextManagerListener == null) {
      throw new NullPointerException();
    }

    if (contextManagerListeners != null) {
      contextManagerListeners.remove(contextManagerListener);
    }
  }

  public void setEnabledContextIds(Set enabledContextIds) {
    contextManager.setActiveContextIds(enabledContextIds);
  }
}
TOP

Related Classes of org.eclipse.ui.internal.contexts.ContextManagerLegacyWrapper$DepthSortedContextIdSet

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.