blob: 25eb47b8403059b37a4cf92b78784d3e7cc2a3d5 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package com.sun.star.wizards.ui.event;
import java.lang.reflect.Field;
import com.sun.star.wizards.common.PropertyNames;
import com.sun.star.uno.Any;
/**
* This class is a factory for Value objects for different types of
* memebers.
* Other than some Value implementations classes this class contains static
* type conversion methods and factory methods.
*
* @see com.sun.star.wizards.ui.event.DataAware.Value
*/
public class DataAwareFields
{
private static final String TRUE = "true";
private static final String FALSE = "false";
/**
* returns a Value Object which sets and gets values
* and converting them to other types, according to the "value" argument.
*
* @param owner
* @param fieldname
* @param value
* @return
* @throws NoSuchFieldException
*/
public static DataAware.Value getFieldValueFor(Object owner, String fieldname, Object value)
{
try
{
Field f = owner.getClass().getField(fieldname);
Class c = f.getType();
Class c2 = value.getClass();
if (c.equals(Boolean.TYPE))
{
return new BooleanFieldValue(f, c2);
}
else if (c.equals(Integer.TYPE))
{
return new IntFieldValue(f, c2);
}
else if (c.equals(Double.TYPE))
{
return new DoubleFieldValue(f, c2);
}
else if (c.equals(String.class) && c2.equals(Integer.class))
{
return new ConvertedStringValue(f, c2);
}
else
{
return new SimpleFieldValue(f);
}
}
catch (NoSuchFieldException ex)
{
ex.printStackTrace();
return null;
}
}
/**
* an abstract implementation of DataAware.Value to access
* object memebers (fields) usign reflection.
*/
private static abstract class FieldValue implements DataAware.Value
{
Field field;
public FieldValue(Field field_)
{
field = field_;
}
public boolean isAssignable(Class type)
{
return field.getDeclaringClass().isAssignableFrom(type);
}
}
private static class BooleanFieldValue extends FieldValue
{
private Class convertTo;
public BooleanFieldValue(Field f, Class convertTo_)
{
super(f);
convertTo = convertTo_;
}
/* (non-Javadoc)
* @see com.sun.star.wizards.ui.event.DataAware.Value#get(java.lang.Object)
*/
public Object get(Object target)
{
try
{
boolean b = field.getBoolean(target);
if (convertTo.equals(Boolean.class))
{
return b ? Boolean.TRUE : Boolean.FALSE;
}
else if (Number.class.isAssignableFrom(convertTo))
{
return toNumber(b ? 1 : 0, convertTo);
}
else if (convertTo.equals(String.class))
{
return String.valueOf(b);
}
else if (convertTo.isArray())
{
return toShortArray(toInt(b));
}
else
{
throw new IllegalArgumentException("Cannot convert boolean value to given type (" + convertTo.getName() + ").");
}
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
return null;
}
}
public void set(Object value, Object target)
{
try
{
field.setBoolean(target, toBoolean(value));
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
}
}
}
private static class IntFieldValue extends FieldValue
{
private Class convertTo;
public IntFieldValue(Field f, Class convertTo_)
{
super(f);
convertTo = convertTo_;
}
/* (non-Javadoc)
* @see com.sun.star.wizards.ui.event.DataAware.Value#get(java.lang.Object)
*/
public Object get(Object target)
{
try
{
int i = field.getInt(target);
if (convertTo.equals(Boolean.class))
{
return i != 0 ? Boolean.TRUE : Boolean.FALSE;
}
else if (Number.class.isAssignableFrom(convertTo))
{
return toNumber(i, convertTo);
}
else if (convertTo.equals(String.class))
{
return String.valueOf(i);
}
else if (convertTo.isArray())
{
return toShortArray(i);
}
else
{
throw new IllegalArgumentException("Cannot convert int value to given type (" + convertTo.getName() + ").");
}
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
return null;
}
}
public void set(Object value, Object target)
{
try
{
field.setInt(target, (int) toDouble(value));
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
}
}
}
private static class DoubleFieldValue extends FieldValue
{
private Class convertTo;
public DoubleFieldValue(Field f, Class convertTo_)
{
super(f);
convertTo = convertTo_;
}
/* (non-Javadoc)
* @see com.sun.star.wizards.ui.event.DataAware.Value#get(java.lang.Object)
*/
public Object get(Object target)
{
try
{
double d = field.getDouble(target);
if (convertTo.equals(Boolean.class))
{
return d != 0 ? Boolean.TRUE : Boolean.FALSE;
}
else if (Number.class.isAssignableFrom(convertTo))
{
return toNumber(d, convertTo);
}
else if (convertTo.equals(String.class))
{
return String.valueOf(d);
}
else if (convertTo.isArray())
{
return toShortArray(d);
}
else
{
throw new IllegalArgumentException("Cannot convert int value to given type (" + convertTo.getName() + ").");
}
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
return null;
}
}
public void set(Object value, Object target)
{
try
{
field.setDouble(target, toDouble(value));
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
}
}
}
private static class ConvertedStringValue extends FieldValue
{
private Class convertTo;
public ConvertedStringValue(Field f, Class convertTo_)
{
super(f);
convertTo = convertTo_;
}
/* (non-Javadoc)
* @see com.sun.star.wizards.ui.event.DataAware.Value#get(java.lang.Object)
*/
public Object get(Object target)
{
try
{
String s = (String) field.get(target);
if (convertTo.equals(Boolean.class))
{
return (s != null && !s.equals(PropertyNames.EMPTY_STRING) && s.equals("true")) ? Boolean.TRUE : Boolean.FALSE;
}
else if (convertTo.equals(Integer.class))
{
if (s == null || s.equals(PropertyNames.EMPTY_STRING))
{
return Any.VOID;
}
else
{
return new Integer(s);
}
}
else if (convertTo.equals(Double.class))
{
if (s == null || s.equals(PropertyNames.EMPTY_STRING))
{
return Any.VOID;
}
else
{
return new Double(s);
}
}
else
{
throw new IllegalArgumentException("Cannot convert int value to given type (" + convertTo.getName() + ").");
}
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
return null;
}
}
public void set(Object value, Object target)
{
try
{
field.set(target, value == null || (value.equals(Any.VOID)) ? PropertyNames.EMPTY_STRING : value.toString());
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
}
}
}
private static class SimpleFieldValue extends FieldValue
{
public SimpleFieldValue(Field f)
{
super(f);
}
/* (non-Javadoc)
* @see com.sun.star.wizards.ui.event.DataAware.Value#get(java.lang.Object)
*/
public Object get(Object target)
{
try
{
if (target == null)
{
if (field.getType().equals(String.class))
{
return PropertyNames.EMPTY_STRING;
}
if (field.getType().equals(Short.class))
{
return new Short((short) 0);
}
if (field.getType().equals(Integer.class))
{
return 0;
}
if (field.getType().equals(short[].class))
{
return new short[0];
}
else
{
return null;
}
}
else
{
return field.get(target);
}
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
return null;
}
}
public void set(Object value, Object target)
{
try
{
field.set(target, value);
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
}
}
}
private static double toDouble(Object value)
{
if (value instanceof Boolean)
{
return ((Boolean) value).booleanValue() ? 1 : 0;
}
else if (value instanceof Number)
{
return ((Number) value).doubleValue();
}
else if (value instanceof String)
{
return Double.valueOf((String) value).doubleValue();
}
else if (value instanceof short[])
{
return ((short[]) value).length == 0 ? 0 : ((short[]) value)[0];
}
else
{
throw new IllegalArgumentException("Can't convert value to double." + value.getClass().getName());
}
}
private static boolean toBoolean(Object value)
{
if (value instanceof Boolean)
{
return ((Boolean) value).booleanValue();
}
else if (value instanceof Number)
{
return ((Number) value).intValue() != 0;
}
else if (value instanceof String)
{
return value.equals(TRUE);
}
else if (value instanceof short[])
{
return ((short[]) value).length != 0 && ((short[]) value)[0] != 0;
}
else
{
throw new IllegalArgumentException("Can't convert value to boolean." + value.getClass().getName());
}
}
private static int toInt(boolean b)
{
return b ? 1 : 0;
}
private static short[] toShortArray(double i)
{
return new short[]
{
(short) i
};
}
private static Number toNumber(double i, Class c)
{
if (c.equals(Integer.class))
{
return new Integer((int) i);
}
else if (c.equals(Short.class))
{
return new Short((short) i);
}
else if (c.equals(Double.class))
{
return new Double(i);
}
else
{
throw new IllegalArgumentException("Cannot convert to the given Number type.");
}
}
}