Mercurial > projects > dwt2
diff org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementMap.d @ 78:0a55d2d5a946
Added file for databinding
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Tue, 14 Apr 2009 11:35:29 +0200 |
parents | |
children | 6be48cf9f95c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementMap.d Tue Apr 14 11:35:29 2009 +0200 @@ -0,0 +1,434 @@ +/******************************************************************************* + * Copyright (c) 2008 Matthew Hall 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: + * Matthew Hall - initial API and implementation (bug 215531) + * Matthew Hall - bug 228125 + ******************************************************************************/ + +module org.eclipse.jface.internal.databinding.viewers.ViewerElementMap; + +import java.lang.all; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.util.Util; +import org.eclipse.jface.viewers.IElementComparer; +import org.eclipse.jface.viewers.StructuredViewer; + +/** + * A {@link Map} whose keys are elements in a {@link StructuredViewer}. The + * keys in the map are compared using an {@link IElementComparer} instead of + * {@link #equals(Object)}. + * <p> + * This class is <i>not</i> a strict implementation the {@link Map} interface. + * It intentionally violates the {@link Map} contract, which requires the use of + * {@link #equals(Object)} when comparing keys. This class is designed for use + * with {@link StructuredViewer} which uses {@link IElementComparer} for element + * comparisons. + * + * @since 1.2 + */ +public class ViewerElementMap : Map { + private Map wrappedMap; + private IElementComparer comparer; + + /** + * Constructs a ViewerElementMap using the given {@link IElementComparer}. + * + * @param comparer + * the {@link IElementComparer} used for comparing keys. + */ + public this(IElementComparer comparer) { + Assert.isNotNull(comparer); + this.wrappedMap = new HashMap(); + this.comparer = comparer; + } + + /** + * Constructs a ViewerElementMap containing all the entries in the specified + * map. + * + * @param map + * the map whose entries are to be added to this map. + * @param comparer + * the {@link IElementComparer} used for comparing keys. + */ + public this(Map map, IElementComparer comparer) { + this(comparer); + Assert.isNotNull(map); + putAll(map); + } + + public void clear() { + wrappedMap.clear(); + } + + public bool containsKey(Object key) { + return wrappedMap.containsKey(new ViewerElementWrapper(key, comparer)); + } + + public bool containsValue(Object value) { + return wrappedMap.containsValue(value); + } + + public Set entrySet() { + final Set wrappedEntrySet = wrappedMap.entrySet(); + return new class() Set { + public bool add(Object o) { + throw new UnsupportedOperationException(); + } + + public bool addAll(Collection c) { + throw new UnsupportedOperationException(); + } + + public void clear() { + wrappedEntrySet.clear(); + } + + public bool contains(Object o) { + for (Iterator iterator = iterator(); iterator.hasNext();) + if (iterator.next().equals(o)) + return true; + return false; + } + + public bool containsAll(Collection c) { + for (Iterator iterator = c.iterator(); iterator.hasNext();) + if (!contains(iterator.next())) + return false; + return true; + } + + public bool isEmpty() { + return wrappedEntrySet.isEmpty(); + } + + public Iterator iterator() { + final Iterator wrappedIterator = wrappedEntrySet.iterator(); + return new class() Iterator { + public bool hasNext() { + return wrappedIterator.hasNext(); + } + + public Object next() { + Map.Entry wrappedEntry = cast(Map.Entry) wrappedIterator + .next(); + return new class() Map.Entry { + public Object getKey() { + return (cast(ViewerElementWrapper) wrappedEntry.getKey()) + .unwrap(); + } + + public Object getValue() { + return wrappedEntry.getValue(); + } + + public Object setValue(Object value) { + return wrappedEntry.setValue(value); + } + + public bool equals(Object obj) { + if (obj is this) + return true; + if (obj is null || !(null !is cast(Map.Entry)obj)) + return false; + Map.Entry that = cast(Map.Entry) obj; + return comparer.equals(this.getKey(), that + .getKey()) + && Util.equals(this.getValue(), that + .getValue()); + } + + public int hashCode() { + return wrappedEntry.hashCode(); + } + }; + } + + public void remove() { + wrappedIterator.remove(); + } + }; + } + + public bool remove(Object o) { + Map.Entry unwrappedEntry = cast(Map.Entry) o; + final ViewerElementWrapper wrappedKey = new ViewerElementWrapper( + unwrappedEntry.getKey(), comparer); + Map.Entry wrappedEntry = new class() Map.Entry { + public Object getKey() { + return wrappedKey; + } + + public Object getValue() { + return unwrappedEntry.getValue(); + } + + public Object setValue(Object value) { + throw new UnsupportedOperationException(); + } + + public bool equals(Object obj) { + if (obj is this) + return true; + if (obj is null || !(null !is cast(Map.Entry)obj)) + return false; + Map.Entry that = cast(Map.Entry) obj; + return Util.equals(wrappedKey, that.getKey()) + && Util + .equals(this.getValue(), that + .getValue()); + } + + public int hashCode() { + return wrappedKey.hashCode() + ^ (getValue() is null ? 0 : getValue() + .hashCode()); + } + }; + return wrappedEntrySet.remove(wrappedEntry); + } + + public bool removeAll(Collection c) { + bool changed = false; + for (Iterator iterator = c.iterator(); iterator.hasNext();) + changed |= remove(iterator.next()); + return changed; + } + + public bool retainAll(Collection c) { + bool changed = false; + Object[] toRetain = c.toArray(); + outer: for (Iterator iterator = iterator(); iterator.hasNext();) { + Object entry = iterator.next(); + for (int i = 0; i < toRetain.length; i++) + if (entry.equals(toRetain[i])) + continue outer; + iterator.remove(); + changed = true; + } + return changed; + } + + public int size() { + return wrappedEntrySet.size(); + } + + public Object[] toArray() { + return toArray(new Object[size()]); + } + + public Object[] toArray(Object[] a) { + int size = size(); + if (a.length < size) { + a = cast(Object[]) Array.newInstance(a.getClass() + .getComponentType(), size); + } + int i = 0; + for (Iterator iterator = iterator(); iterator.hasNext();) { + a[i] = iterator.next(); + i++; + } + return a; + } + + public bool equals(Object obj) { + if (obj is this) + return true; + if (obj is null || !(null !is cast(Set)obj)) + return false; + Set that = cast(Set) obj; + return this.size() is that.size() && containsAll(that); + } + + public int hashCode() { + return wrappedEntrySet.hashCode(); + } + }; + } + + public Object get(Object key) { + return wrappedMap.get(new ViewerElementWrapper(key, comparer)); + } + + public bool isEmpty() { + return wrappedMap.isEmpty(); + } + + public Set keySet() { + final Set wrappedKeySet = wrappedMap.keySet(); + return new class() Set { + public bool add(Object o) { + throw new UnsupportedOperationException(); + } + + public bool addAll(Collection c) { + throw new UnsupportedOperationException(); + } + + public void clear() { + wrappedKeySet.clear(); + } + + public bool contains(Object o) { + return wrappedKeySet.contains(new ViewerElementWrapper(o, comparer)); + } + + public bool containsAll(Collection c) { + for (Iterator iterator = c.iterator(); iterator.hasNext();) + if (!wrappedKeySet.contains(new ViewerElementWrapper(iterator.next(), comparer))) + return false; + return true; + } + + public bool isEmpty() { + return wrappedKeySet.isEmpty(); + } + + public Iterator iterator() { + final Iterator wrappedIterator = wrappedKeySet.iterator(); + return new class() Iterator { + public bool hasNext() { + return wrappedIterator.hasNext(); + } + + public Object next() { + return (cast(ViewerElementWrapper) wrappedIterator.next()).unwrap(); + } + + public void remove() { + wrappedIterator.remove(); + } + }; + } + + public bool remove(Object o) { + return wrappedKeySet.remove(new ViewerElementWrapper(o, comparer)); + } + + public bool removeAll(Collection c) { + bool changed = false; + for (Iterator iterator = c.iterator(); iterator.hasNext();) + changed |= wrappedKeySet + .remove(new ViewerElementWrapper(iterator.next(), comparer)); + return changed; + } + + public bool retainAll(Collection c) { + bool changed = false; + Object[] toRetain = c.toArray(); + outer: for (Iterator iterator = iterator(); iterator.hasNext();) { + Object element = iterator.next(); + for (int i = 0; i < toRetain.length; i++) + if (comparer.equals(element, toRetain[i])) + continue outer; + // element not contained in collection, remove. + remove(element); + changed = true; + } + return changed; + } + + public int size() { + return wrappedKeySet.size(); + } + + public Object[] toArray() { + return toArray(new Object[wrappedKeySet.size()]); + } + + public Object[] toArray(Object[] a) { + int size = wrappedKeySet.size(); + ViewerElementWrapper[] wrappedArray = cast(ViewerElementWrapper[]) wrappedKeySet + .toArray(new ViewerElementWrapper[size]); + Object[] result = a; + if (a.length < size) { + result = cast(Object[]) Array.newInstance(a.getClass() + .getComponentType(), size); + } + for (int i = 0; i < size; i++) + result[i] = wrappedArray[i].unwrap(); + return result; + } + + public bool equals(Object obj) { + if (obj is this) + return true; + if (obj is null || !(null !is cast(Set)obj)) + return false; + Set that = cast(Set) obj; + return this.size() is that.size() && containsAll(that); + } + + public int hashCode() { + return wrappedKeySet.hashCode(); + } + }; + } + + public Object put(Object key, Object value) { + return wrappedMap.put(new ViewerElementWrapper(key, comparer), value); + } + + public void putAll(Map other) { + for (Iterator iterator = other.entrySet().iterator(); iterator + .hasNext();) { + Map.Entry entry = cast(Map.Entry) iterator.next(); + wrappedMap.put(new ViewerElementWrapper(entry.getKey(), comparer), entry.getValue()); + } + } + + public Object remove(Object key) { + return wrappedMap.remove(new ViewerElementWrapper(key, comparer)); + } + + public int size() { + return wrappedMap.size(); + } + + public Collection values() { + return wrappedMap.values(); + } + + public bool equals(Object obj) { + if (obj is this) + return true; + if (obj is null || !(null !is cast(Map)obj)) + return false; + Map that = cast(Map) obj; + return this.entrySet().equals(that.entrySet()); + } + + public int hashCode() { + return wrappedMap.hashCode(); + } + + /** + * Returns a Map for mapping viewer elements as keys to values, using the + * given {@link IElementComparer} for key comparisons. + * + * @param comparer + * the element comparer to use in key comparisons. If null, the + * returned map will compare keys according to the standard + * contract for {@link Map} interface contract. + * @return a Map for mapping viewer elements as keys to values, using the + * given {@link IElementComparer} for key comparisons. + */ + public static Map withComparer(IElementComparer comparer) { + if (comparer is null) + return new HashMap(); + return new ViewerElementMap(comparer); + } +}