| /******************************************************************************* |
| * Copyright (c) 2009, 2015 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; |
| |
| import java.util.Iterator; |
| import java.util.LinkedHashSet; |
| |
| import org.eclipse.ui.navigator.INavigatorContentDescriptor; |
| |
| /** |
| * Used to associate the NavigatorContentDescriptor (NCD) with an object that it contributes. |
| * |
| * The NCD/object association is tracked using the NavigatorContentService.rememberContribution(). |
| * |
| * @since 3.2 |
| * |
| */ |
| public class ContributorTrackingSet extends LinkedHashSet { |
| |
| |
| private static final long serialVersionUID = 2516241537206281972L; |
| |
| private INavigatorContentDescriptor contributor; |
| private INavigatorContentDescriptor firstClassContributor; |
| private NavigatorContentService contentService; |
| |
| /** |
| * Construct a tracking set. |
| * |
| * @param aContentService |
| */ |
| public ContributorTrackingSet(NavigatorContentService aContentService) { |
| contentService = aContentService; |
| } |
| |
| /** |
| * Construct a tracking set. |
| * |
| * @param aContentService |
| * @param elements |
| */ |
| public ContributorTrackingSet(NavigatorContentService aContentService, Object[] elements) { |
| |
| for (Object element : elements) |
| super.add(element); |
| |
| contentService = aContentService; |
| } |
| |
| @Override |
| public boolean add(Object o) { |
| if (contributor != null) { |
| contentService.rememberContribution(contributor, firstClassContributor, o); |
| } |
| return super.add(o); |
| } |
| |
| @Override |
| public boolean remove(Object o) { |
| contentService.forgetContribution(o); |
| return super.remove(o); |
| } |
| |
| |
| @Override |
| public void clear() { |
| Iterator it = iterator(); |
| while (it.hasNext()) |
| contentService.forgetContribution(it.next()); |
| super.clear(); |
| } |
| |
| /** |
| * |
| * @return The current contributor. |
| */ |
| public INavigatorContentDescriptor getContributor() { |
| return contributor; |
| } |
| |
| /** |
| * |
| * @return The current contributor. |
| */ |
| public INavigatorContentDescriptor getFirstClassContributor() { |
| return firstClassContributor; |
| } |
| |
| /** |
| * |
| * @param newContributor The contributor to record for the next series of adds. |
| * @param theFirstClassContributor The first class contributor associated with the newContributor. |
| */ |
| public void setContributor(INavigatorContentDescriptor newContributor, INavigatorContentDescriptor theFirstClassContributor) { |
| contributor = newContributor; |
| firstClassContributor = theFirstClassContributor; |
| } |
| |
| /** |
| * @param contents |
| */ |
| public void setContents(Object[] contents) { |
| super.clear(); |
| if(contents != null) |
| for (Object content : contents) |
| add(content); |
| |
| } |
| |
| @Override |
| public Iterator iterator() { |
| return new Iterator() { |
| |
| Iterator delegateIterator = ContributorTrackingSet.super.iterator(); |
| Object current; |
| |
| @Override |
| public boolean hasNext() { |
| return delegateIterator.hasNext(); |
| } |
| |
| @Override |
| public Object next() { |
| current = delegateIterator.next(); |
| return current; |
| } |
| |
| @Override |
| public void remove() { |
| delegateIterator.remove(); |
| contentService.forgetContribution(current); |
| } |
| }; |
| } |
| |
| } |