/**
*
*/
package org.javabuilders.swt.handler.type;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.javabuilders.BuildException;
import org.javabuilders.BuildProcess;
import org.javabuilders.BuilderConfig;
import org.javabuilders.Node;
import org.javabuilders.handler.AbstractTypeHandler;
import org.javabuilders.swt.SwtJavaBuilder;
import org.javabuilders.swt.SwtBuilderUtils;
/**
* Handler for creating menu items
* @author Jacek Furmankiewicz
*/
public class MenuItemTypeHandler extends AbstractTypeHandler {
private static final MenuItemTypeHandler singleton = new MenuItemTypeHandler();
/**
* @return Singleton
*/
public static MenuItemTypeHandler getInstance() {return singleton;}
/**
* Constructor
*/
private MenuItemTypeHandler() {
super(SwtJavaBuilder.STYLE);
}
/* (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 {
Object parentMenu = parent.getMainObject();
MenuItem instance =null;
int style = SwtBuilderUtils.getSWTStyle((String) typeDefinition.get(SwtJavaBuilder.STYLE));
if (parentMenu instanceof Menu) {
Menu menu = (Menu) parentMenu;
instance = new MenuItem(menu,style);
} else if (parentMenu instanceof MenuItem) {
MenuItem item = (MenuItem) parentMenu;
Menu menu = item.getMenu();
if (menu == null) {
menu = new Menu(SwtBuilderUtils.getShell(parent),SWT.DROP_DOWN);
item.setMenu(menu);
}
instance = new MenuItem(menu,style);
} else {
throw new BuildException("MenuItem \"{0}\" can only be under a Menu or MenuItem",key);
}
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);
//handle the accelerator automatically
if (node.containsProperty(SwtJavaBuilder.TEXT)) {
String[] parts = node.getStringProperty(SwtJavaBuilder.TEXT).split("\t");
if (parts.length > 1) {
String acc = parts[1];
String[] components = acc.split("\\+");
int accelerator = SWT.NONE;
for(int i = 0; i < components.length; i++) {
if (i < (components.length - 1)) {
int metaKey = SwtBuilderUtils.getSWTConstantFromExactName(components[i].toUpperCase());
accelerator = accelerator | metaKey;
} else {
//last one must be the letter
accelerator = accelerator | components[i].charAt(0);
}
}
MenuItem item = (MenuItem) instance;
item.setAccelerator(accelerator);
}
}
return node;
}
/* (non-Javadoc)
* @see org.javabuilders.IApplicable#getApplicableClass()
*/
public Class<?> getApplicableClass() {
return MenuItem.class;
}
}