blob: 564a833e6194d11fada06d182633090de752d4f3 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}