// Near Infinity - An Infinity Engine Browser and Editor // Copyright (C) 2001 - 2005 Jon Olav Hauglid // See LICENSE.txt for license information package org.infinity.datatype; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; import org.infinity.resource.StructEntry; import org.infinity.util.io.StreamUtils; public class FloatNumber extends Datatype implements InlineEditable { private double value; public FloatNumber(ByteBuffer buffer, int offset, int length, String name) { this(null, buffer, offset, length, name); } public FloatNumber(StructEntry parent, ByteBuffer buffer, int offset, int length, String name) { super(parent, offset, length, name); value = 0.0; read(buffer, offset); } //--------------------- Begin Interface InlineEditable --------------------- @Override public boolean update(Object value) { try { double newValue = Double.parseDouble(value.toString()); if (getSize() == 4) { newValue = Double.valueOf(newValue).floatValue(); } this.value = newValue; return true; } catch (NumberFormatException e) { e.printStackTrace(); } return false; } //--------------------- End Interface InlineEditable --------------------- //--------------------- Begin Interface Writeable --------------------- @Override public void write(OutputStream os) throws IOException { StreamUtils.writeBytes(os, toByteBuffer(value, getSize())); } //--------------------- End Interface Writeable --------------------- //--------------------- Begin Interface Readable --------------------- @Override public int read(ByteBuffer buffer, int offset) { switch (getSize()) { case 4: case 8: value = toFloatNumber(buffer, offset, getSize()); break; default: throw new IllegalArgumentException(); } return offset + getSize(); } //--------------------- End Interface Readable --------------------- @Override public String toString() { return Double.toString(value); } public double getValue() { return value; } // Converts byte array of specified length into a double value private static double toFloatNumber(ByteBuffer buffer, int offset, int length) { if (length == 4 || length == 8) { buffer.position(offset); switch (length) { case 4: return buffer.getFloat(); case 8: return buffer.getDouble(); } } return 0.0; } // Converts double value into byte array of specified length private static ByteBuffer toByteBuffer(double value, int length) { if (length == 4 || length == 8) { ByteBuffer buffer = StreamUtils.getByteBuffer(length); switch (length) { case 4: buffer.putFloat((float)value); break; case 8: buffer.putDouble(value); break; } buffer.position(0); return buffer; } return null; } }