/**
*
*/
package org.javabuilders.swt.handler.type.layout;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.javabuilders.BuildException;
import org.javabuilders.BuildProcess;
import org.javabuilders.BuilderConfig;
import org.javabuilders.InvalidPropertyFormatException;
import org.javabuilders.Node;
import org.javabuilders.handler.AbstractTypeHandler;
import org.javabuilders.handler.ITypeChildrenHandler;
import org.javabuilders.swt.SwtJavaBuilder;
/**
* FillLayout handler
* @author Jacek Furmankiewicz
*
*/
public class FillLayoutHandler extends AbstractTypeHandler implements ITypeChildrenHandler{
private static final FillLayoutHandler singleton = new FillLayoutHandler();
private Map<String,Integer> styleMap = new HashMap<String,Integer>();
/**
* Returns singleton
* @return Singleton
*/
public static FillLayoutHandler getInstance() {
return singleton;
}
/**
* Constructor
*/
public FillLayoutHandler() {
super(SwtJavaBuilder.MARGIN_HEIGHT,SwtJavaBuilder.MARGIN_WIDTH,SwtJavaBuilder.SPACING,SwtJavaBuilder.STYLE);
styleMap.put("horizontal", SWT.HORIZONTAL);
styleMap.put("vertical", SWT.VERTICAL);
}
/* (non-Javadoc)
* @see org.javabuilders.handler.ITypeHandler#createNewInstance(org.javabuilders.BuilderConfig, org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String, java.util.Map)
*/
public Node createNewInstance(BuilderConfig config, BuildProcess process,
Node parent, String key, Map<String, Object> typeDefinition)
throws BuildException {
FillLayout instance = new FillLayout();
return useExistingInstance(config, process, parent, key, typeDefinition, instance);
}
/* (non-Javadoc)
* @see org.javabuilders.handler.ITypeHandler#useExistingInstance(org.javabuilders.BuilderConfig, org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String, java.util.Map, java.lang.Object)
*/
public Node useExistingInstance(BuilderConfig config, BuildProcess process,
Node parent, String key, Map<String, Object> typeDefinition,
Object instance) throws BuildException {
Node node = new Node(parent,key,typeDefinition);
node.setMainObject(instance);
FillLayout layout = (FillLayout)instance;
//handle all 4 potential properties
if (typeDefinition.containsKey(SwtJavaBuilder.MARGIN_HEIGHT)) {
String value = String.valueOf(typeDefinition.get(SwtJavaBuilder.MARGIN_HEIGHT));
try {
int intValue = Integer.parseInt(value);
layout.marginHeight = intValue;
} catch (NumberFormatException ex) {
throw new InvalidPropertyFormatException(key,SwtJavaBuilder.MARGIN_HEIGHT,value,SwtJavaBuilder.MARGIN_HEIGHT + ": int",SwtJavaBuilder.MARGIN_HEIGHT + ": 8",ex);
}
}
if (typeDefinition.containsKey(SwtJavaBuilder.MARGIN_WIDTH)) {
String value = String.valueOf(typeDefinition.get(SwtJavaBuilder.MARGIN_WIDTH));
try {
int intValue = Integer.parseInt(value);
layout.marginWidth = intValue;
} catch (NumberFormatException ex) {
throw new InvalidPropertyFormatException(key,SwtJavaBuilder.MARGIN_WIDTH,value,SwtJavaBuilder.MARGIN_WIDTH + ": int",SwtJavaBuilder.MARGIN_WIDTH + ": 8",ex);
}
}
if (typeDefinition.containsKey(SwtJavaBuilder.SPACING)) {
String value = String.valueOf(typeDefinition.get(SwtJavaBuilder.SPACING));
try {
int intValue = Integer.parseInt(value);
layout.spacing = intValue;
} catch (NumberFormatException ex) {
throw new InvalidPropertyFormatException(key,SwtJavaBuilder.SPACING,value,SwtJavaBuilder.SPACING + ": int",SwtJavaBuilder.SPACING + ": 8",ex);
}
}
if (typeDefinition.containsKey(SwtJavaBuilder.STYLE)) {
String value = String.valueOf(typeDefinition.get(SwtJavaBuilder.STYLE)).toLowerCase();
if (styleMap.containsKey(value)) {
Integer type = styleMap.get(value);
layout.type = type;
} else {
throw new InvalidPropertyFormatException(key,SwtJavaBuilder.STYLE,value,SwtJavaBuilder.STYLE + ": horizontal|vertical",SwtJavaBuilder.STYLE + ": vertical");
}
}
Composite composite = (Composite)parent.getMainObject();
composite.setLayout(layout);
return node;
}
/* (non-Javadoc)
* @see org.javabuilders.IKeyValueConsumer#getApplicableClass()
*/
public Class<FillLayout> getApplicableClass() {
return FillLayout.class;
}
}