| /******************************************************************************* |
| * 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.Set; |
| |
| import org.eclipse.jface.internal.databinding.provisional.observable.mapping.MappingDiff; |
| import org.eclipse.jface.internal.databinding.provisional.observable.mapping.ObservableMappingWithDomain; |
| import org.eclipse.jface.internal.databinding.provisional.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 ObservableMappingWithDomain { |
| |
| /** |
| * |
| */ |
| 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(); |
| initDomain(domain); |
| } |
| |
| /** |
| * @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() |
| final int[] indices = new int[] { 0 }; |
| fireMappingValueChange(new MappingDiff() { |
| public Set getElements() { |
| return getDomain(); |
| } |
| |
| public int[] getAffectedIndices() { |
| return indices; |
| } |
| |
| public Object[] getOldMappingValues(Object element, int[] indices) { |
| return new Object[] { doComputeResult(element, oldOp) }; |
| } |
| |
| public Object[] getNewMappingValues(Object element, int[] indices) { |
| return new Object[] { doComputeResult(element, operation) }; |
| } |
| }); |
| } |
| |
| protected Object doGetMappingValue(Object element) { |
| return doComputeResult(element, this.op); |
| } |
| |
| 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 void addListenerTo(Object domainElement) { |
| // ignore, no need to listen to immutable Double objects |
| } |
| |
| protected void removeListenerFrom(Object domainElement) { |
| // ignore, no need to listen to immutable Double objects |
| } |
| |
| public Object getValueType() { |
| return Double.class; |
| } |
| |
| } |