/* AWE - Amanzi Wireless Explorer
* http://awe.amanzi.org
* (C) 2008-2009, AmanziTel AB
*
* This library is provided under the terms of the Eclipse Public License
* as described at http://www.eclipse.org/legal/epl-v10.html. Any use,
* reproduction or distribution of the library constitutes recipient's
* acceptance of this agreement.
*
* This library is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.amanzi.awe.properties.ui.views.internal;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.widgets.Composite;
/**
* TODO Purpose of
* <p>
* </p>
*
* @author Vladislav_Kondratenko
* @since 1.0.0
*/
public class PropertyCellEditor extends TextCellEditor {
private static final Logger LOGGER = Logger.getLogger(PropertyCellEditor.class);
private Object oldValue;
private Object castedObject;
/**
* @param parent
* @param border
*/
public PropertyCellEditor(final Composite parent, final int border) {
super(parent, border);
}
@Override
protected Object doGetValue() {
String newValue = (String)super.doGetValue();
if (castedObject != null && castedObject.toString().equals(newValue)) {
return castedObject;
}
try {
if (oldValue.getClass().isArray()) {
castedObject = performArrayCasting(newValue);
} else {
if (oldValue.getClass().equals(Character.class)) {
castedObject = oldValue.getClass().cast(newValue);
}
castedObject = oldValue.getClass().getConstructor(newValue.getClass()).newInstance(newValue);
}
} catch (Exception e) {
LOGGER.error("Error on casting value ", e);
castedObject = newValue;
return castedObject;
}
return castedObject;
}
@Override
protected void doSetValue(final Object value) {
oldValue = value;
text.setText(value.toString());
}
@Override
public String getErrorMessage() {
return null;
}
@Override
public boolean isValueValid() {
return castedObject == null || !castedObject.toString().equals(doGetValue());
}
/**
* @param newValue
* @return
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws IllegalArgumentException
*/
private Object performArrayCasting(final String newValue) throws IllegalArgumentException, SecurityException,
InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
String preparedString = prepareStringToConverting(newValue);
String[] stringArray = preparedString.split(",");
ArraysConverter converter = ArraysConverter.findByType(oldValue.getClass());
if (converter == null) {
LOGGER.error("can't find converter for type" + oldValue.getClass());
return null;
}
return converter.convertToArray(stringArray);
}
/**
* @param newValue
* @return
*/
private String prepareStringToConverting(String newValue) {
newValue = newValue.replace("[", StringUtils.EMPTY);
newValue = newValue.replace("]", StringUtils.EMPTY);
return newValue;
}
}