blob: 910a6dbcb2d73ddecf43ba5748df4ee49da91400 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation, See4sys 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
* See4sys - added support for problem markers on model objects (rather than
* only on workspace resources). Unfortunately, there was no other
* choice than copying the whole code from
* org.eclipse.ui.views.markers.internal for that purpose because
* many of the relevant classes, methods, and fields are private or
* package private.
*******************************************************************************/
package org.eclipse.sphinx.emf.validation.ui.views;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.sphinx.emf.util.EObjectUtil;
import org.eclipse.sphinx.emf.util.EcorePlatformUtil;
import org.eclipse.sphinx.emf.validation.markers.ValidationMarkerManager;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PlatformUI;
/**
* MarkerFilter is the class that defines a filter on markers in a MarkerView.
*/
public class MarkerFilter implements Cloneable {
static final String TAG_ENABLED = "enabled"; //$NON-NLS-1$
private static final String TAG_ON_RESOURCE = "onResource"; //$NON-NLS-1$
private static final String TAG_SELECTED_TYPES = "selectedType"; //$NON-NLS-1$
private static final String TAG_WORKING_SET = "workingSet"; //$NON-NLS-1$
private static final String TAG_TYPES_DELIMITER = ":"; //$NON-NLS-1$
/**
* New attribute to handle the selection status of marker types.
*/
private static final String TAG_SELECTION_STATUS = "selectionStatus"; //$NON-NLS-1$
/**
* Attribute status true.
*/
private static final String SELECTED_FALSE = "false"; //$NON-NLS-1$
/**
* Attribute status false.
*/
private static final String SELECTED_TRUE = "true"; //$NON-NLS-1$
/**
* Constant for any element.
*/
public static final int ON_ANY = 0;
/**
* Constant for any selected element only.
*/
public static final int ON_SELECTED_ONLY = 1;
/**
* Constant for selected element and children.
*/
public static final int ON_SELECTED_AND_CHILDREN = 2;
/**
* Constant for any element in same container.
*/
public static final int ON_ANY_IN_SAME_CONTAINER = 3;
/**
* Constant for on working set.
*/
public static final int ON_WORKING_SET = 4;
static final int DEFAULT_ON_RESOURCE = ON_ANY;
static final boolean DEFAULT_ACTIVATION_STATUS = true;
protected List rootTypes = new ArrayList();
protected List selectedTypes = new ArrayList();
protected IWorkingSet workingSet;
protected int onResource;
protected boolean enabled;
private Object[] focusSelection;
private Set cachedWorkingSet;
// The human readable name for the filter
private String name;
/**
* Create a new instance of the receiver.
*
* @param filterName
* The human readable name for the filter
* @param rootTypes
* The types this filter will be applied to
*/
MarkerFilter(String filterName, String[] rootTypes) {
name = filterName;
for (String element : rootTypes) {
MarkerType type = MarkerTypesModel.getInstance().getType(element);
if (!this.rootTypes.contains(type)) {
this.rootTypes.add(type);
}
}
resetState();
}
/**
* List all types known to this MarkerFilter.
*
* @param types
* list to be filled in with types
*/
public void addAllSubTypes(List types) {
for (int i = 0; i < rootTypes.size(); i++) {
MarkerType rootType = (MarkerType) rootTypes.get(i);
addAllSubTypes(types, rootType);
}
}
private void addAllSubTypes(List types, MarkerType type) {
if (type == null) {
return;
}
if (!types.contains(type)) {
types.add(type);
}
MarkerType[] subTypes = type.getSubtypes();
for (MarkerType element : subTypes) {
addAllSubTypes(types, element);
}
}
/**
* Adds all markers in the given set of objects to the given list
*
* @param resultList
* @param objects
* @param markerTypeId
* @param depth
* @throws CoreException
*/
private List findMarkers(Object[] objects, int depth, int limit, IProgressMonitor mon, boolean ignoreExceptions) throws CoreException {
if (objects == null || objects.length < 1) {
return Collections.EMPTY_LIST;
}
List resultList = new ArrayList(objects.length * 2);
// Optimization: if a type appears in the selectedTypes list along with
// all of its
// subtypes, then combine these in a single search.
// List of types that haven't been replaced by one of their supertypes
HashSet typesToSearch = new HashSet(selectedTypes.size());
// List of types that appeared in selectedTypes along with all of their
// subtypes
HashSet includeAllSubtypes = new HashSet(selectedTypes.size());
typesToSearch.addAll(selectedTypes);
Iterator iter = selectedTypes.iterator();
while (iter.hasNext()) {
MarkerType type = (MarkerType) iter.next();
Collection subtypes = Arrays.asList(type.getAllSubTypes());
if (selectedTypes.containsAll(subtypes)) {
typesToSearch.removeAll(subtypes);
includeAllSubtypes.add(type);
}
}
mon.beginTask(MarkerMessages.MarkerFilter_searching, typesToSearch.size() * objects.length);
// Use this hash set to determine if there are any resources in the
// list that appear along with their parent.
HashSet resourcesToSearch = new HashSet();
// Insert all the resources into the hashset
for (Object next : objects) {
if (next instanceof IResource) {
if (!((IResource) next).exists()) {
continue;
}
} else if (next instanceof EObject) {
if (EcorePlatformUtil.getFile((EObject) next) == null || !EcorePlatformUtil.getFile((EObject) next).exists()) {
continue;
}
}
if (resourcesToSearch.contains(next)) {
mon.worked(typesToSearch.size());
} else {
resourcesToSearch.add(next);
}
}
// Iterate through all the selected resources
IResource resource = null;
for (Object object : objects) {
iter = typesToSearch.iterator();
if (object instanceof IResource) {
resource = (IResource) object;
} else if (object instanceof EObject) {
resource = EcorePlatformUtil.getFile((EObject) object);
}
// Skip resources that don't exist
if (resource == null || !resource.isAccessible()) {
continue;
}
if (object instanceof IResource && depth == IResource.DEPTH_INFINITE) {
// Determine if any parent of this resource is also in our
// filter
IResource parent = resource.getParent();
boolean found = false;
while (parent != null) {
if (resourcesToSearch.contains(parent)) {
found = true;
}
parent = parent.getParent();
}
// If a parent of this resource is also in the filter, we can
// skip it
// because we'll pick up its markers when we search the parent.
if (found) {
continue;
}
} // END IResource.DEPTH_INFINITE
// Iterate through all the marker types
while (iter.hasNext()) {
MarkerType markerType = (MarkerType) iter.next();
IMarker[] markers = new IMarker[0];
// Only search for subtypes of the marker if we found all of its
// subtypes in the filter criteria.
if (object instanceof IResource) {
markers = resource.findMarkers(markerType.getId(), includeAllSubtypes.contains(markerType), depth);
} else if (object instanceof EObject) {
// FIXME based on the model relationship between EObject.
int depthValidation = EObjectUtil.DEPTH_INFINITE;
switch (depth) {
case IResource.DEPTH_ONE: // not treated
case IResource.DEPTH_ZERO:
depthValidation = EObjectUtil.DEPTH_ZERO;
break;
case IResource.DEPTH_INFINITE:
depthValidation = EObjectUtil.DEPTH_INFINITE;
break;
default: // There is something rotten in my kingdom.
// Let's choose an arbitrary value
depthValidation = EObjectUtil.DEPTH_INFINITE;
}
markers = ValidationMarkerManager.getInstance().getValidationMarkersList((EObject) object, depthValidation);
}
mon.worked(1);
for (IMarker element : markers) {
ConcreteMarker marker;
try {
marker = MarkerList.createMarker(element);
} catch (CoreException e) {
if (ignoreExceptions) {
continue;
}
throw e;
}
if (limit != -1 && resultList.size() >= limit) {
return resultList;
}
if (selectMarker(marker)) {
resultList.add(marker);
}
}
}
}
mon.done();
return resultList;
}
/**
* Subclasses should override to determine if the given marker passes the filter.
*
* @param marker
* @return <code>true</code> if the marker passes the filter and <code>false</code> otherwise
*/
protected boolean selectMarker(ConcreteMarker marker) {
return true;
}
/**
* Searches the workspace for markers that pass this filter.
*
* @return Collection of markers.
*/
Collection findMarkers(IProgressMonitor mon, boolean ignoreExceptions) throws CoreException {
List unfiltered = Collections.EMPTY_LIST;
if (!isEnabled()) {
unfiltered = findMarkers(new IResource[] { ResourcesPlugin.getWorkspace().getRoot() }, IResource.DEPTH_INFINITE, -1, mon,
ignoreExceptions);
} else {
// int limit = getFilterOnMarkerLimit() ? getMarkerLimit() + 1 : -1;
int limit = -1;
switch (getOnResource()) {
case ON_ANY: {
unfiltered = findMarkers(new IResource[] { ResourcesPlugin.getWorkspace().getRoot() }, IResource.DEPTH_INFINITE, limit, mon,
ignoreExceptions);
break;
}
case ON_SELECTED_ONLY: {
unfiltered = findMarkers(focusSelection, IResource.DEPTH_ZERO, limit, mon, ignoreExceptions);
break;
}
case ON_SELECTED_AND_CHILDREN: {
unfiltered = findMarkers(focusSelection, IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions);
break;
}
case ON_ANY_IN_SAME_CONTAINER: {
unfiltered = findMarkers(getProjects(focusSelection), IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions);
break;
}
case ON_WORKING_SET: {
unfiltered = findMarkers(getResourcesInWorkingSet(), IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions);
}
}
}
if (unfiltered == null) {
unfiltered = Collections.EMPTY_LIST;
}
return unfiltered;
}
/**
* Return the resources in the working set. If it is empty then return the workspace root.
*
* @return IResource[]
*/
IResource[] getResourcesInWorkingSet() {
if (workingSet == null) {
return new IResource[0];
}
if (workingSet.isEmpty()) {
return new IResource[] { ResourcesPlugin.getWorkspace().getRoot() };
}
IAdaptable[] elements = workingSet.getElements();
List result = new ArrayList(elements.length);
for (IAdaptable element : elements) {
IResource next = (IResource) element.getAdapter(IResource.class);
if (next != null) {
result.add(next);
}
}
return (IResource[]) result.toArray(new IResource[result.size()]);
}
/**
* Returns a set of strings representing the full pathnames to every resource directly or indirectly contained in
* the working set. A resource is in the working set iff its path name can be found in this set.
*
* @return Set
*/
private Set getWorkingSetAsSetOfPaths() {
if (cachedWorkingSet == null) {
HashSet result = new HashSet();
addResourcesAndChildren(result, getResourcesInWorkingSet());
cachedWorkingSet = result;
}
return cachedWorkingSet;
}
/*******************************************************************************************************************
* Adds the paths of all resources in the given array to the given set.
*/
private void addResourcesAndChildren(HashSet result, IResource[] resources) {
for (IResource currentResource : resources) {
result.add(currentResource.getFullPath().toString());
if (currentResource instanceof IContainer) {
IContainer cont = (IContainer) currentResource;
try {
addResourcesAndChildren(result, cont.members());
} catch (CoreException e) {
// Ignore errors
}
}
}
}
/**
* Returns the set of projects that contain the given set of resources.
*
* @param resources
* @return IProject[]
*/
static IProject[] getProjects(IResource[] resources) {
if (resources == null) {
return new IProject[0];
}
Collection projects = getProjectsAsCollection(resources);
return (IProject[]) projects.toArray(new IProject[projects.size()]);
}
/**
* Returns the set of projects that contain the given set of resources or EObject.
*
* @param objects
* @return IProject[]
*/
static IProject[] getProjects(Object[] objects) {
if (objects == null || objects.length < 1) {
return new IProject[0];
}
Collection projects = getProjectsAsCollection(objects);
return (IProject[]) projects.toArray(new IProject[projects.size()]);
}
/**
* Return the projects for the elements.
*
* @param elements
* collection of IResource , IResourceMapping, or EObject
* @return Collection of IProject
*/
static Collection getProjectsAsCollection(Object[] elements) {
HashSet projects = new HashSet();
for (Object element : elements) {
if (element instanceof IResource) {
projects.add(((IResource) element).getProject());
} else if (element instanceof EObject) {
IResource resource = EcorePlatformUtil.getFile((EObject) element);
if (resource != null) {
projects.add(resource.getProject());
}
} else {
IProject[] mappingProjects = ((ResourceMapping) element).getProjects();
for (IProject element2 : mappingProjects) {
projects.add(element2);
}
}
}
return projects;
}
/**
* Return whether or not the receiver would select the marker.
*
* @param marker
* @return boolean
*/
public boolean select(ConcreteMarker marker) {
if (!isEnabled()) {
return true;
}
return selectByType(marker) && selectBySelection(marker) && selectMarker(marker);
}
private boolean selectByType(ConcreteMarker marker) {
return selectedTypes.contains(MarkerTypesModel.getInstance().getType(marker.getType()));
}
/**
* Returns whether the specified marker should be filter out or not.
*
* @param marker
* the marker to test
* @return true=the marker should not be filtered out false=the marker should be filtered out
*/
private boolean selectBySelection(ConcreteMarker marker) {
if (onResource == ON_ANY || marker == null) {
return true;
}
if (focusSelection == null) {
return true;
}
IResource resource = marker.getResource();
if (onResource == ON_WORKING_SET) {
if (resource != null) {
return isEnclosed(resource);
}
} else if (onResource == ON_ANY_IN_SAME_CONTAINER) {
IProject project = resource.getProject();
if (project == null) {
return false;
}
IProject selectedProject = null;
for (Object element : focusSelection) {
if (element instanceof IResource) {
selectedProject = ((IResource) element).getProject();
} else if (element instanceof EObject) {
IResource res = EcorePlatformUtil.getFile((EObject) element);
if (res != null) {
selectedProject = res.getProject();
}
}
if (selectedProject == null) {
continue;
}
if (project.equals(selectedProject)) {
return true;
}
}
} else if (onResource == ON_SELECTED_ONLY) {
for (Object element : focusSelection) {
if (element instanceof IResource) {
if (resource.equals(element)) {
return true;
}
} else {
// TODO
}
}
} else if (onResource == ON_SELECTED_AND_CHILDREN) {
for (Object element : focusSelection) {
if (element instanceof IResource) {
IResource parentResource = resource;
while (parentResource != null) {
if (parentResource.equals(element)) {
return true;
}
parentResource = parentResource.getParent();
}
} else {
// TODO
}
}
}
return false;
}
/**
* Returns if the given resource is enclosed by a working set element. Previous versions of this method used
* IContainmentAdapter for containment tests. For performance reasons, this is no longer possible. Code that relies
* on this behavior should be updated appropriately.
*
* @param element
* resource to test for enclosure by a working set element
* @return true if element is enclosed by a working set element and false otherwise.
*/
private boolean isEnclosed(IResource element) {
if (workingSet == null) {
return false;
}
if (workingSet.isEmpty()) {
return true; // Everything is in an empty working set
}
Set workingSetPaths = getWorkingSetAsSetOfPaths();
return workingSetPaths.contains(element.getFullPath().toString());
}
/**
* <ul>
* <li><code>MarkerFilter.ON_ANY</code> if showing items associated with any resource.</li>
* <li><code>MarkerFilter.ON_SELECTED_ONLY</code> if showing items associated with the selected resource within the
* workbench.</li>
* <li><code>MarkerFilter.ON_SELECTED_AND_CHILDREN</code> if showing items associated with the selected resource
* within the workbench and its children.</li>
* <li><code>MarkerFilter.ON_ANY_OF_SAME_PROJECT</code> if showing items in the same project as the selected
* resource within the workbench.</li>
* <li><code>MarkerFilter.ON_WORKING_SET</code> if showing items in some working set.</li>
* </ul>
*
* @return int
*/
public int getOnResource() {
return onResource;
}
/**
* Sets the type of filtering by selection.
*
* @param onResource
* must be one of:
* <ul>
* <li><code>MarkerFilter.ON_ANY_RESOURCE</code></li>
* <li><code>MarkerFilter.ON_SELECTED_RESOURCE_ONLY</code></li>
* <li><code>MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN</code></li>
* <li><code>MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT</code></li>
* <li><code>MarkerFilter.ON_WORKING_SET</code></li>
* </ul>
*/
void setOnResource(int onResource) {
if (onResource >= ON_ANY && onResource <= ON_WORKING_SET) {
this.onResource = onResource;
}
}
/**
* @return the selected object(s) withing the workbench.
*/
Object[] getFocusObject() {
return focusSelection;
}
/**
* Sets the focused objects.
*
* @param objects
*/
public void setFocusSelection(Object[] objects) {
focusSelection = objects;
}
/**
* @return <ul>
* <li><code>true</code> if the filter is enabled.</li>
* <li><code>false</code> if the filter is not enabled.</li>
* </ul>
*/
public boolean isEnabled() {
return enabled;
}
/**
* <b>Warning:</b> for internal package use only. Return the root marker types.
*
* @return the root marker types.
*/
public List getRootTypes() {
return rootTypes;
}
/**
* <b>Warning:</b> for internal package use only. Return the selected types.
*
* @return the selected marker types to be displayed.
*/
public List getSelectedTypes() {
return selectedTypes;
}
/**
* Find the typeModel entry that matches id.
*
* @param id
* the ID for a marker type
* @return MarkerType or <code>null</code> if it is not found.
*/
public MarkerType getMarkerType(String id) {
return MarkerTypesModel.getInstance().getType(id);
}
/**
* @return the current working set or <code>null</code> if no working set is defined.
*/
IWorkingSet getWorkingSet() {
return workingSet;
}
/**
* Sets the enablement state of the filter.
*/
void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/**
* Sets the current working set.
*/
void setWorkingSet(IWorkingSet workingSet) {
this.workingSet = workingSet;
cachedWorkingSet = null;
}
/**
* Reset to the default state.
*/
void resetState() {
enabled = DEFAULT_ACTIVATION_STATUS;
onResource = DEFAULT_ON_RESOURCE;
selectedTypes.clear();
addAllSubTypes(selectedTypes);
setWorkingSet(null);
}
/**
* Restore the state in the memento.
*
* @param memento
*/
public final void restoreState(IMemento memento) {
resetState();
restoreFilterSettings(memento);
}
/**
* Restore the state of the receiver in the supplied settings. This is kept for backwards compatibility with 3.1
* dialog settings.
*
* @param settings
*/
public void restoreFilterSettings(IDialogSettings settings) {
resetState();
String setting = settings.get(TAG_ENABLED);
if (setting != null) {
enabled = Boolean.valueOf(setting).booleanValue();
}
setting = settings.get(TAG_ON_RESOURCE);
if (setting != null) {
try {
onResource = Integer.parseInt(setting);
} catch (NumberFormatException eNumberFormat) {
}
}
// new selection list attribute
// format is "id:(true|false):"
setting = settings.get(TAG_SELECTION_STATUS);
if (setting != null) {
selectedTypes.clear();
// get the complete list of types
List newTypes = new ArrayList();
addAllSubTypes(newTypes);
StringTokenizer stringTokenizer = new StringTokenizer(setting);
while (stringTokenizer.hasMoreTokens()) {
String id = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
String status = null;
if (stringTokenizer.hasMoreTokens()) {
status = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
}
MarkerType markerType = MarkerTypesModel.getInstance().getType(id);
if (markerType != null) {
newTypes.remove(markerType);
// add the type to the selected list
if (!SELECTED_FALSE.equals(status) && !selectedTypes.contains(markerType)) {
selectedTypes.add(markerType);
}
}
}
// any types we know about that weren't either true or
// false in the selection attribute are new. By default,
// new marker types will be selected=true
for (int i = 0; i < newTypes.size(); ++i) {
selectedTypes.add(newTypes.get(i));
}
} else {
// the settings didn't contain the new selection attribute
// so check for the old selection attribute.
// format is just "id:"
setting = settings.get(TAG_SELECTED_TYPES);
if (setting != null) {
generateSelectedTypes(setting);
}
}
setting = settings.get(TAG_WORKING_SET);
if (setting != null) {
setWorkingSet(PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(setting));
}
}
/**
* Set the selected types based on the value.
*
* @param selectedTypesValue
*/
void generateSelectedTypes(String selectedTypesValue) {
selectedTypes.clear();
StringTokenizer stringTokenizer = new StringTokenizer(selectedTypesValue);
while (stringTokenizer.hasMoreTokens()) {
MarkerType markerType = getMarkerType(stringTokenizer.nextToken(TAG_TYPES_DELIMITER));
if (markerType != null && !selectedTypes.contains(markerType)) {
selectedTypes.add(markerType);
}
}
}
/**
* Find the markerType matching typeName
*
* @param typeName
* @return MarkerType
*/
MarkerType findMarkerType(String typeName) {
return MarkerTypesModel.getInstance().getType(typeName);
}
/**
* Restore the state of the receiver in the supplied settings.
*
* @param memento
*/
protected void restoreFilterSettings(IMemento memento) {
String setting = memento.getString(TAG_ENABLED);
if (setting != null) {
enabled = Boolean.valueOf(setting).booleanValue();
}
Integer resourceSetting = memento.getInteger(TAG_ON_RESOURCE);
if (resourceSetting != null) {
onResource = resourceSetting.intValue();
}
// new selection list attribute
// format is "id:(true|false):"
setting = memento.getString(TAG_SELECTION_STATUS);
if (setting != null) {
selectedTypes.clear();
// get the complete list of types
List newTypes = new ArrayList();
addAllSubTypes(newTypes);
StringTokenizer stringTokenizer = new StringTokenizer(setting);
while (stringTokenizer.hasMoreTokens()) {
String id = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
String status = null;
if (stringTokenizer.hasMoreTokens()) {
status = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
}
MarkerType markerType = MarkerTypesModel.getInstance().getType(id);
if (markerType != null) {
newTypes.remove(markerType);
// add the type to the selected list
if (!SELECTED_FALSE.equals(status) && !selectedTypes.contains(markerType)) {
selectedTypes.add(markerType);
}
}
}
// any types we know about that weren't either true or
// false in the selection attribute are new. By default,
// new marker types will be selected=true
for (int i = 0; i < newTypes.size(); ++i) {
selectedTypes.add(newTypes.get(i));
}
} else {
// the settings didn't contain the new selection attribute
// so check for the old selection attribute.
// format is just "id:"
setting = memento.getString(TAG_SELECTED_TYPES);
if (setting != null) {
generateSelectedTypes(setting);
}
}
setting = memento.getString(TAG_WORKING_SET);
if (setting != null) {
setWorkingSet(PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(setting));
}
}
/**
* Save the filter settings for the receiver.
*
* @param settings
*/
public void saveFilterSettings(IMemento settings) {
settings.putString(TAG_ENABLED, String.valueOf(enabled));
settings.putInteger(TAG_ON_RESOURCE, onResource);
String markerTypeIds = ""; //$NON-NLS-1$
List includedTypes = new ArrayList();
addAllSubTypes(includedTypes);
for (int i = 0; i < includedTypes.size(); i++) {
MarkerType markerType = (MarkerType) includedTypes.get(i);
markerTypeIds += markerType.getId() + TAG_TYPES_DELIMITER;
if (selectedTypes.contains(markerType)) {
markerTypeIds += SELECTED_TRUE + TAG_TYPES_DELIMITER;
} else {
markerTypeIds += SELECTED_FALSE + TAG_TYPES_DELIMITER;
}
}
settings.putString(TAG_SELECTION_STATUS, markerTypeIds);
if (workingSet != null) {
settings.putString(TAG_WORKING_SET, workingSet.getName());
}
}
/**
* Get the name of the receiver
*
* @return String
*/
public String getName() {
return name;
}
/**
* Make a clone of the receiver.
*
* @return MarkerFilter
* @throws CloneNotSupportedException
*/
public MarkerFilter makeClone() throws CloneNotSupportedException {
return (MarkerFilter) clone();
}
/**
* Set the selected types.
*
* @param selectedTypes
* List of MarkerType.
*/
public void setSelectedTypes(List selectedTypes) {
this.selectedTypes = selectedTypes;
}
}