blob: 2acc1f7e49fc01741bcaed3dc0622bf32a668916 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.converters;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.core.databinding.conversion.IConverter;
import org.eclipse.core.databinding.conversion.StringToNumberConverter;
import org.eclipse.swt.layout.GridData;
import org.eclipse.xwt.IConstants;
import org.eclipse.xwt.XWT;
import org.eclipse.xwt.XWTException;
import org.eclipse.xwt.XWTMaps;
import org.eclipse.xwt.metadata.IMetaclass;
/**
* String to Integer converter
*
* @author yyang (yves.yang@soyatec.com)
*/
public class StringToInteger implements IConverter {
private static final String GRIDDATA_PREFIX = "GRIDDATA.";
private static final String STYLES_SEP = "|";
public static StringToInteger instance = new StringToInteger();
protected StringToNumberConverter toNumberConverter = StringToNumberConverter.toInteger(false);
public Object convert(Object fromObject) {
String str = (String) fromObject;
if (str.indexOf(STYLES_SEP) != -1) {
List<String> values = new ArrayList<String>();
StringTokenizer stk = new StringTokenizer(str, STYLES_SEP);
while (stk.hasMoreTokens()) {
values.add(stk.nextToken());
}
int result = 0;
for (String value : values) {
result |= convertInt(value.trim());
}
return result;
}
return convertInt(str);
}
protected int convertInt(String str) {
if (str == null || str.equals("")) {
return 0;
}
try {
// Quick solution for numbers.
return (Integer) toNumberConverter.convert(str);
} catch (Exception e) {
String normalizedStr = str.toUpperCase().trim();
if (normalizedStr.startsWith(GRIDDATA_PREFIX)) {
return convertGridDataInt(normalizedStr);
}
try {
int index = str.lastIndexOf('.');
if (str.indexOf('.') != -1) {
String className = str.substring(0, index);
if (className.startsWith("(") && className.endsWith("")) {
className = className.substring(1, className.length()-1);
Class<?> type = XWT.getLoadingContext().loadClass(className);
if (type != null) {
String memberName = str.substring(index+1);
Field field = type.getField(memberName);
if (Modifier.isStatic(field.getModifiers())) {
return field.getInt(null);
}
}
}
else {
IMetaclass metaclass = XWT.getMetaclass(className, IConstants.XWT_NAMESPACE);
if (metaclass != null) {
Class<?> type = metaclass.getType();
if (type != null) {
String memberName = str.substring(index+1);
Field field = type.getField(memberName);
if (Modifier.isStatic(field.getModifiers())) {
return field.getInt(null);
}
}
}
}
}
} catch (SecurityException e1) {
} catch (IllegalArgumentException e1) {
} catch (NoSuchFieldException e1) {
} catch (IllegalAccessException e1) {
} catch (XWTException e1) {
}
return defaultConvertInt(str);
}
}
protected int convertGridDataInt(String str) {
if ("GridData.BEGINNING".equalsIgnoreCase(str)) {
return GridData.BEGINNING;
} else if ("GridData.CENTER".equalsIgnoreCase(str)) {
return GridData.CENTER;
} else if ("GridData.END".equalsIgnoreCase(str)) {
return GridData.END;
} else if ("GridData.FILL".equalsIgnoreCase(str)) {
return GridData.FILL;
} else if ("GridData.FILL_BOTH".equalsIgnoreCase(str)) {
return GridData.FILL_BOTH;
} else if ("GridData.FILL_HORIZONTAL".equalsIgnoreCase(str)) {
return GridData.FILL_HORIZONTAL;
} else if ("GridData.GRAB_HORIZONTAL".equalsIgnoreCase(str)) {
return GridData.GRAB_HORIZONTAL;
} else if ("GridData.GRAB_VERTICAL".equalsIgnoreCase(str)) {
return GridData.GRAB_VERTICAL;
} else if ("GridData.HORIZONTAL_ALIGN_BEGINNING".equalsIgnoreCase(str)) {
return GridData.HORIZONTAL_ALIGN_BEGINNING;
} else if ("GridData.HORIZONTAL_ALIGN_CENTER".equalsIgnoreCase(str)) {
return GridData.HORIZONTAL_ALIGN_CENTER;
} else if ("GridData.HORIZONTAL_ALIGN_END".equalsIgnoreCase(str)) {
return GridData.HORIZONTAL_ALIGN_END;
} else if ("GridData.HORIZONTAL_ALIGN_FILL".equalsIgnoreCase(str)) {
return GridData.HORIZONTAL_ALIGN_FILL;
} else if ("GridData.VERTICAL_ALIGN_BEGINNING".equalsIgnoreCase(str)) {
return GridData.VERTICAL_ALIGN_BEGINNING;
} else if ("GridData.VERTICAL_ALIGN_CENTER".equalsIgnoreCase(str)) {
return GridData.VERTICAL_ALIGN_CENTER;
} else if ("GridData.VERTICAL_ALIGN_END".equalsIgnoreCase(str)) {
return GridData.VERTICAL_ALIGN_END;
} else if ("GridData.VERTICAL_ALIGN_FILL".equalsIgnoreCase(str)) {
return GridData.VERTICAL_ALIGN_FILL;
}
return 0;
}
protected int defaultConvertInt(String str) {
return XWTMaps.getValue(str);
}
public Object getFromType() {
return String.class;
}
public Object getToType() {
return Integer.class;
}
}