blob: 88ec45400f1343f446606532f1d43ae2f5ebea71 [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.jface.examples.databinding.contentprovider.test;
import java.util.Collections;
import java.util.Set;
import org.eclipse.core.databinding.observable.map.ComputedObservableMap;
import org.eclipse.core.databinding.observable.map.MapDiff;
import org.eclipse.core.databinding.observable.set.IObservableSet;
/**
* Simple function that performs one of three operations on Doubles:
* <ul>
* <li>Multiply by two</li>
* <li>Round to nearest integer</li>
* <li>Do nothing</li>
* </ul>
*
* @since 1.0
*/
public class SomeMathFunction extends ComputedObservableMap {
/**
*
*/
public static final int OP_IDENTITY = 0;
/**
*
*/
public static final int OP_MULTIPLY = 1;
/**
*
*/
public static final int OP_ROUND = 2;
private int op = OP_ROUND;
/**
* @param domain
*/
public SomeMathFunction(IObservableSet domain) {
super(domain);
init();
}
/**
* @param operation
*/
public void setOperation(final int operation) {
final int oldOp = this.op;
this.op = operation;
// Fire a change event. Changing the operation is going to affect every
// answer returned by
// this function, so include every element in the function domain in the
// event.
// If this was a change that would only affect a subset of elements, we
// would include
// the subset of affected elements rather than using
// domain.toCollection()
fireMapChange(new MapDiff() {
public Set getAddedKeys() {
return Collections.EMPTY_SET;
}
public Set getChangedKeys() {
return keySet();
}
public Object getNewValue(Object key) {
return doComputeResult(key, operation);
}
public Object getOldValue(Object key) {
return doComputeResult(key, oldOp);
}
public Set getRemovedKeys() {
return Collections.EMPTY_SET;
}
});
}
private Object doComputeResult(Object element, int op) {
switch (op) {
case OP_IDENTITY:
return element;
case OP_MULTIPLY:
return new Double((((Double) element).doubleValue() * 2.0));
case OP_ROUND:
return new Double(Math.floor((((Double) element).doubleValue())));
}
return element;
}
protected Object doGet(Object key) {
return doComputeResult(key, this.op);
}
protected Object doPut(Object key, Object value) {
throw new UnsupportedOperationException();
}
protected void hookListener(Object addedKey) {
// ignore, no need to listen to immutable Double objects
}
protected void unhookListener(Object removedKey) {
// ignore, no need to listen to immutable Double objects
}
}