blob: 55867a5aab398aaac408a068001beedd62ec5e12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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.ltk.core.refactoring;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
/**
* A special set to manage group categories. Group category sets are value
* objects and are therefore best used as static final fields to share a
* group category set between n {@link TextEditBasedChangeGroup}s.
* <p>
* Note: this class is not intended to be subclassed
* </p>
*
* @since 3.2
*/
public class GroupCategorySet {
/**
* Constant representing a group category set containing no
* group categories.
*/
public static final GroupCategorySet NONE= new GroupCategorySet() {
public boolean contains(GroupCategory category) {
return false;
}
public List asList() {
return Collections.EMPTY_LIST;
}
};
/**
* Creates a new group category set containing the union of the given two
* group category sets
*
* @param one the first set of group categories
* @param two the second set of group categories
*
* @return the union
*/
public static GroupCategorySet union(GroupCategorySet one, GroupCategorySet two) {
Assert.isNotNull(one);
Assert.isNotNull(two);
// for performance we are using identity here. This is
// valid since group categories are value objects and
// therefore best used as static final fields.
if (one == two)
return one;
if (one == NONE)
return two;
if (two == NONE)
return one;
Set combined= new HashSet();
combined.addAll(one.asList());
combined.addAll(two.asList());
return new GroupCategorySet(combined);
}
private List fContent;
private GroupCategorySet() {
fContent= Collections.EMPTY_LIST;
}
private GroupCategorySet(Set categories) {
fContent= new ArrayList(categories);
}
/**
* Creates a new list of group categories initialized
* with the given group category.
*
* @param category the first category
*/
public GroupCategorySet(GroupCategory category) {
Assert.isNotNull(category);
fContent= new ArrayList(1);
fContent.add(category);
}
/**
* Creates a new set of group categories initialized
* from the given array of group categories
*
* @param categories the initial group categories
*/
public GroupCategorySet(GroupCategory[] categories) {
Assert.isNotNull(categories);
fContent= new ArrayList(categories.length);
for (int i= 0; i < categories.length; i++) {
if (!fContent.contains(categories[i]))
fContent.add(categories[i]);
}
}
/**
* Returns whether the given category is contained
* in this set of group categories
*
* @param category the category to test containment for
*
* @return <code>true</code> if the category is contained
* in this set; otherwise <code>false</code>
*/
public boolean contains(GroupCategory category) {
return fContent.contains(category);
}
/**
* Returns whether one of the given categories is contained
* in this set of group categories
*
* @param categories the categories to test containment for
*
* @return <code>true</code> if one of the given categories is
* contained in this set; otherwise <code>false</code>
*/
public boolean containsOneCategory(List categories) {
for (Iterator iter= categories.iterator(); iter.hasNext();) {
GroupCategory category= (GroupCategory)iter.next();
if(contains(category))
return true;
}
return false;
}
/**
* Converts the group categories into a a unmodifiable
* list.
*
* @return an unmodifiable list containing all group
* categories
*/
public List asList() {
return Collections.unmodifiableList(fContent);
}
}