//(c) Copyright 2007, Scott Vorthmann. All rights reserved. package org.vorthmann.zome.app.impl; import java.math.BigInteger; import java.util.StringTokenizer; import org.vorthmann.ui.DefaultController; import com.vzome.core.algebra.AlgebraicField; import com.vzome.core.algebra.AlgebraicNumber; import com.vzome.core.algebra.BigRational; public class NumberController extends DefaultController { private AlgebraicNumber value; private final AlgebraicField field; public NumberController( AlgebraicField field ) { this .field = field; this .value = field .one(); } @Override public String[] getCommandList( String listName ) { int order = this .field .getOrder(); switch ( listName ) { case "labels": // first label should always be "1", last should always be "/" String[] result = new String[ order + 1 ]; result[ 0 ] = "1"; result[ order ] = "/"; for( int i = 1; i < order; i++ ) result[ i ] = this .field .getIrrational( i ); return result; case "values": BigInteger divisor = value .getDivisor(); result = new String[ order + 1 ]; result[ order ] = divisor .toString(); BigRational[] factors = value .getFactors(); for( int i = 0; i < order; i++ ) result[ i ] = factors[ i ] .times( new BigRational( divisor, BigInteger.ONE ) ) .toString(); return result; default: return super.getCommandList( listName ); } } @Override public void setProperty( String property, Object value ) { switch ( property ) { case "values": StringTokenizer values = new StringTokenizer( (String) value ); int[] inputs = new int[ field .getOrder() ]; // divisor will be the last int int divisor = 1; for ( int i = 0; values .hasMoreTokens(); i++ ) if ( i < inputs.length ) inputs[ i ] = Integer .parseInt( values .nextToken() ); else divisor = Integer .parseInt( values .nextToken() ); this .value = field .createAlgebraicNumber( inputs ) .dividedBy( field .createRational( divisor ) ); return; default: super.setProperty( property, value ); } } public AlgebraicNumber getValue() { return this .value; } public void setValue( AlgebraicNumber value ) { this .value = value; } }